এনএসআরঞ্জ থেকে রেঞ্জ <স্ট্রিং.আইডেক্স>


258

আমি কিভাবে রূপান্তর করতে পারেন NSRangeথেকেRange<String.Index> সুইফট কি?

আমি নিম্নলিখিত UITextFieldDelegateপদ্ধতিটি ব্যবহার করতে চাই :

    func textField(textField: UITextField!,
        shouldChangeCharactersInRange range: NSRange,
        replacementString string: String!) -> Bool {

textField.text.stringByReplacingCharactersInRange(???, withString: string)

এখানে চিত্র বর্ণনা লিখুন


71
অ্যাপল আপনাকে নতুন রেঞ্জ ক্লাস দেওয়ার জন্য আপনাকে ধন্যবাদ, তবে তারপরে এনএসআরগুলারএক্সপ্রেসনের মতো স্ট্রিং ইউটিলিটি ক্লাসগুলির কোনও আপডেট না করে!
পাজল

উত্তর:


269

NSStringসংস্করণ (যেমন সুইফট স্ট্রিং উল্টোদিকে) এর replacingCharacters(in: NSRange, with: NSString)একটি গ্রহণ NSRange, তাই এক সহজ সমাধান হয় রূপান্তর Stringকরার NSStringপ্রথম । প্রতিনিধি এবং প্রতিস্থাপন পদ্ধতির নামগুলি সুইফট 3 এবং 2 তে কিছুটা আলাদা, সুতরাং আপনি কোন সুইফ্টটি ব্যবহার করছেন তার উপর নির্ভর করে:

সুইফট 3.0

func textField(_ textField: UITextField,
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool {

  let nsString = textField.text as NSString?
  let newString = nsString?.replacingCharacters(in: range, with: string)
}

সুইফট 2.x

func textField(textField: UITextField,
               shouldChangeCharactersInRange range: NSRange,
               replacementString string: String) -> Bool {

    let nsString = textField.text as NSString?
    let newString = nsString?.stringByReplacingCharactersInRange(range, withString: string)
}

14
textFieldইমোজি-র মতো মাল্টি-কোড ইউনিট ইউনিকোড অক্ষর থাকলে এটি কাজ করবে না work যেহেতু এটি একটি প্রবেশ ক্ষেত্র, কোনও ব্যবহারকারী ইমোজি (😂) ভালভাবে প্রবেশ করতে পারে, অন্য পৃষ্ঠায় 1 জাতীয় পতাকা একক অক্ষরের যেমন অক্ষর (🇪🇸)।
zaph

2
@ জাফ: যেহেতু পরিসীমা ইউআইটিেক্সটফিল্ড থেকে এসেছে, যা এনএসএসটিংয়ের বিরুদ্ধে ওবজে-সিতে লেখা হয়েছে, তাই আমি সন্দেহ করি যে স্ট্রিংয়ের ইউনিকোড অক্ষরের উপর ভিত্তি করে কেবল বৈধ ব্যাপ্তি ডেলিগেট কলব্যাক সরবরাহ করবে এবং তাই এটি ব্যবহার করা নিরাপদ to , কিন্তু আমি ব্যক্তিগতভাবে এটি পরীক্ষা করিনি।
অ্যালেক্স প্রেটজ্লাভ

2
@Zaph, সত্যি যে, আমার পয়েন্ট হল UITextFieldDelegateএর textField:shouldChangeCharactersInRange:replacementString:পদ্ধতি, যেহেতু কলব্যাক একটি ব্যবহারকারী কীবোর্ড থেকে অক্ষর লিখে উপর ভিত্তি করে তৈরি একটি সীমার যা শুরু হয় বা ইউনিকোড অক্ষর ভিতরে প্রান্ত প্রদান করবে না, এবং এটি অংশ মাত্র টাইপ করা সম্ভব নয় একটি ইমোজি ইউনিকোড চরিত্রের। দ্রষ্টব্য যে ডেলিগেটটি ওবজে-সিতে লেখা থাকলে এটি একই সমস্যা হতে পারে।
অ্যালেক্স প্রেটজ্লাভ

4
সেরা উত্তর না। কোড পড়া সহজ তবে @ মার্টিন-আর এর সঠিক উত্তর রয়েছে।
রোগ

3
আসলে আপনার ছেলেরা এটি করা উচিত(textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)
Wanbok Choi

361

এর মতো সুইফট 4 (Xcode 9), সুইফট মান গ্রন্থাগার সুইফট স্ট্রিং রেঞ্জ (মধ্যে রূপান্তর করতে পদ্ধতি প্রদান করে Range<String.Index>) এবং NSStringরেঞ্জ ( NSRange)। উদাহরণ:

let str = "a👿b🇩🇪c"
let r1 = str.range(of: "🇩🇪")!

// String range to NSRange:
let n1 = NSRange(r1, in: str)
print((str as NSString).substring(with: n1)) // 🇩🇪

// NSRange back to String range:
let r2 = Range(n1, in: str)!
print(str[r2]) // 🇩🇪

সুতরাং পাঠ্য ক্ষেত্রের প্রতিনিধি পদ্ধতিতে পাঠ্য প্রতিস্থাপনটি এখন যেমন করা যায়

func textField(_ textField: UITextField,
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool {

    if let oldString = textField.text {
        let newString = oldString.replacingCharacters(in: Range(range, in: oldString)!,
                                                      with: string)
        // ...
    }
    // ...
}

(সুইফট 3 এবং এর আগেরটির জন্য পুরানো উত্তরসমূহ :)

সুইফট 1.2 হিসাবে, String.Indexএকটি ইনিশিয়ালাইজার রয়েছে

init?(_ utf16Index: UTF16Index, within characters: String)

যা রূপান্তর করতে ব্যবহার করা যেতে পারে NSRangeথেকে Range<String.Index>সঠিকভাবে একটি থেকে মাধ্যমিক রূপান্তর ছাড়া (ইমোজির, আঞ্চলিক সূচক বা অন্য বর্ধিত গ্রাফিম ক্লাস্টার এর সব ক্ষেত্রেই সহ) NSString:

extension String {
    func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? {
        let from16 = advance(utf16.startIndex, nsRange.location, utf16.endIndex)
        let to16 = advance(from16, nsRange.length, utf16.endIndex)
        if let from = String.Index(from16, within: self),
            let to = String.Index(to16, within: self) {
                return from ..< to
        }
        return nil
    }
}

এই পদ্ধতিটি option চ্ছিক স্ট্রিং রেঞ্জটি দেয় কারণ সমস্ত নয়NSRange প্রদত্ত সুইফ্ট স্ট্রিংয়ের জন্য গুলি বৈধ নয়।

UITextFieldDelegateপ্রতিনিধি পদ্ধতি তারপর হিসেবে লেখা যেতে পারে

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if let swRange = textField.text.rangeFromNSRange(range) {
        let newString = textField.text.stringByReplacingCharactersInRange(swRange, withString: string)
        // ...
    }
    return true
}

বিপরীত রূপান্তর হয়

extension String {
    func NSRangeFromRange(range : Range<String.Index>) -> NSRange {
        let utf16view = self.utf16
        let from = String.UTF16View.Index(range.startIndex, within: utf16view) 
        let to = String.UTF16View.Index(range.endIndex, within: utf16view)
        return NSMakeRange(from - utf16view.startIndex, to - from)
    }
}

একটি সহজ পরীক্ষা:

let str = "a👿b🇩🇪c"
let r1 = str.rangeOfString("🇩🇪")!

// String range to NSRange:
let n1 = str.NSRangeFromRange(r1)
println((str as NSString).substringWithRange(n1)) // 🇩🇪

// NSRange back to String range:
let r2 = str.rangeFromNSRange(n1)!
println(str.substringWithRange(r2)) // 🇩🇪

সুইফট 2 এর জন্য আপডেট:

এর উত্তরটিতে সুইফট 2 সংস্করণটি rangeFromNSRange()ইতিমধ্যে সেরিই ইয়াকোভেনকো এই উত্তরে দিয়েছিলেন , আমি এখানে এটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করছি:

extension String {
    func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? {
        let from16 = utf16.startIndex.advancedBy(nsRange.location, limit: utf16.endIndex)
        let to16 = from16.advancedBy(nsRange.length, limit: utf16.endIndex)
        if let from = String.Index(from16, within: self),
            let to = String.Index(to16, within: self) {
                return from ..< to
        }
        return nil
    }
}

এর সুইফট 2 সংস্করণ NSRangeFromRange()হল

extension String {
    func NSRangeFromRange(range : Range<String.Index>) -> NSRange {
        let utf16view = self.utf16
        let from = String.UTF16View.Index(range.startIndex, within: utf16view)
        let to = String.UTF16View.Index(range.endIndex, within: utf16view)
        return NSMakeRange(utf16view.startIndex.distanceTo(from), from.distanceTo(to))
    }
}

সুইফট 3 (এক্সকোড 8) এর জন্য আপডেট:

extension String {
    func nsRange(from range: Range<String.Index>) -> NSRange {
        let from = range.lowerBound.samePosition(in: utf16)
        let to = range.upperBound.samePosition(in: utf16)
        return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),
                       length: utf16.distance(from: from, to: to))
    }
}

extension String {
    func range(from nsRange: NSRange) -> Range<String.Index>? {
        guard
            let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
            let to16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location + nsRange.length, limitedBy: utf16.endIndex),
            let from = from16.samePosition(in: self),
            let to = to16.samePosition(in: self)
            else { return nil }
        return from ..< to
    }
}

উদাহরণ:

let str = "a👿b🇩🇪c"
let r1 = str.range(of: "🇩🇪")!

// String range to NSRange:
let n1 = str.nsRange(from: r1)
print((str as NSString).substring(with: n1)) // 🇩🇪

// NSRange back to String range:
let r2 = str.range(from: n1)!
print(str.substring(with: r2)) // 🇩🇪

7
এই কোডটি একাধিক ইউটিএফ -16 কোড পয়েন্ট, যেমন ইমোজিস সমন্বিত অক্ষরের জন্য সঠিকভাবে কাজ করে না। - একটি উদাহরণস্বরূপ, যদি টেক্সট ক্ষেত্রের এবং টেক্সট "👿" রয়েছে আপনি যে চরিত্র মুছুন, তারপর rangeহয় (0,2)কারণ NSRangeহল UTF-16 একটি অক্ষর বোঝায় NSString। কিন্তু এটা যেমন বড়, মোট ছাত্র এক একটি সুইফট স্ট্রিং ইউনিকোড অক্ষর। - let end = advance(start, range.length)রেফারেন্স করা উত্তর থেকে এই ক্ষেত্রে ত্রুটি বার্তাটি "মারাত্মক ত্রুটি: এন্ডআইডেক্স বৃদ্ধি করতে পারে না" ক্রাশ করে।
মার্টিন আর

8
@ ম্যাটডিপিপাস্কোলে: অবশ্যই আমার উদ্দেশ্য ছিল ইউনিকোড-নিরাপদ উপায়ে "আমি কীভাবে এনএসআরঞ্জকে রেঞ্জ <স্ট্রিং.আইডেক্স> সুইফটে রূপান্তর করতে পারি" এই ভারব্যাটিক প্রশ্নের উত্তর দেওয়ার জন্য (আশা করি যে কেউ এটির কাজে লাগতে পারে, যা এখন অবধি এরকম নয়):
মার্টিন আর

5
তাদের জন্য অ্যাপলের কাজ করার জন্য আপনাকে আরও একবার ধন্যবাদ। আপনার মতো লোক এবং স্ট্যাক ওভারফ্লো না থাকলে আমি কোনওভাবেই iOS / OS X এর বিকাশ করব না। জীবন খুব ছোট.
ওম্বল

1
@ জিমিনিবোব৯৯: এআইপিআই Stringরেফারেন্সটিতে ঝাঁপিয়ে পড়তে কমান্ড-ক্লিক করুন , সমস্ত পদ্ধতি এবং মন্তব্যগুলি পড়ুন, তারপরে এটি কাজ না করা পর্যন্ত বিভিন্ন জিনিস চেষ্টা করুন :)
মার্টিন আর

1
কারণ let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex), আমি মনে করি আপনি আসলে এটিকে সীমাবদ্ধ করতে চান utf16.endIndex - 1। অন্যথায়, আপনি স্ট্রিং শেষে শুরু করতে পারেন।
মাইকেল

18

Range<String.Index>ক্লাসিকের পরিবর্তে আপনার ব্যবহার করা উচিত NSRange। আমি যেভাবে এটি করি (সম্ভবত আরও ভাল উপায় আছে) তা স্ট্রিংটিকে String.Indexএটিকে চালিত করে তোলা advance

আপনি কোন ব্যাপ্তিটি প্রতিস্থাপনের চেষ্টা করছেন তা আমি জানি না, তবে আসুন আপনি প্রথমে 2 টি অক্ষর প্রতিস্থাপন করতে চান তা ভান করুন।

var start = textField.text.startIndex // Start at the string's start index
var end = advance(textField.text.startIndex, 2) // Take start index and advance 2 characters forward
var range: Range<String.Index> = Range<String.Index>(start: start,end: end)

textField.text.stringByReplacingCharactersInRange(range, withString: string)

18

এই উত্তরমার্টিন আর এর সঠিক বলে মনে হচ্ছে কারণ এটি ইউনিকোডের জন্য অ্যাকাউন্ট।

তবে পোস্টের সময় (সুইফ্ট 1) তার কোডটি সুইফট ২.০ (এক্সকোড)) তে সংকলন করে না, কারণ তারা মুছে ফেলেছে advance() ফাংশন । আপডেট সংস্করণ নীচে:

সুইফট 2

extension String {
    func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? {
        let from16 = utf16.startIndex.advancedBy(nsRange.location, limit: utf16.endIndex)
        let to16 = from16.advancedBy(nsRange.length, limit: utf16.endIndex)
        if let from = String.Index(from16, within: self),
            let to = String.Index(to16, within: self) {
                return from ..< to
        }
        return nil
    }
}

সুইফট 3

extension String {
    func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? {
        if let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
            let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),
            let from = String.Index(from16, within: self),
            let to = String.Index(to16, within: self) {
                return from ..< to
        }
        return nil
    }
}

সুইফট 4

extension String {
    func rangeFromNSRange(nsRange : NSRange) -> Range<String.Index>? {
        return Range(nsRange, in: self)
    }
}

7

এটি এমিলির জবাবের মতো তবে যেহেতু আপনি বিশেষভাবে জিজ্ঞাসা করেছিলেন যে কীভাবে আপনাকে রূপান্তর করতে NSRangeহয় Range<String.Index>এই জাতীয় কিছু:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

     let start = advance(textField.text.startIndex, range.location) 
     let end = advance(start, range.length) 
     let swiftRange = Range<String.Index>(start: start, end: end) 
     ...

}

2
একটি স্ট্রিংয়ের অক্ষর দর্শন এবং ইউটিএফ 16 ভিউর দৈর্ঘ্য বিভিন্ন হতে পারে। এই ফাংশনটি ইউটিএফ 16 ইনডেক্সগুলি ব্যবহার করছে (এটি যা NSRangeবলছে, যদিও এর উপাদানগুলি পূর্ণসংখ্যার সাথে) স্ট্রিংয়ের অক্ষর দর্শনগুলির বিরুদ্ধে, যা "অক্ষর" যুক্ত স্ট্রিংয়ে ব্যবহার করার সময় ব্যর্থ হতে পারে যা একাধিক ইউটিএফ 16 ইউনিট প্রকাশ করতে পারে।
নাট কুক

6

@ এমিলির দুর্দান্ত উত্তরের উপর একটি রিফ, কোনও প্রতিস্থাপন / প্রতিযোগিতামূলক উত্তর নয়।
(Xcode6-Beta5)

var original    = "🇪🇸😂This is a test"
var replacement = "!"

var startIndex = advance(original.startIndex, 1) // Start at the second character
var endIndex   = advance(startIndex, 2) // point ahead two characters
var range      = Range(start:startIndex, end:endIndex)
var final = original.stringByReplacingCharactersInRange(range, withString:replacement)

println("start index: \(startIndex)")
println("end index:   \(endIndex)")
println("range:       \(range)")
println("original:    \(original)")
println("final:       \(final)")

আউটপুট:

start index: 4
end index:   7
range:       4..<7
original:    🇪🇸😂This is a test
final:       🇪🇸!his is a test

একাধিক কোড এককের জন্য সূচীগুলির অ্যাকাউন্টটি লক্ষ্য করুন। পতাকাটি (আঞ্চলিক সূচক সিম্বল লেটার্স ইএস) 8 বাইট এবং (আনন্দ অশ্রু সহ ফ্যাক্স) 4 বাইট হয়। (এই বিশেষ ক্ষেত্রে এটি সক্রিয় যে UTF-8, UTF-16 এবং UTF-32 উপস্থাপনা জন্য বাইট সংখ্যা একই হয়।)

এটিকে একটি মজাদার মধ্যে মোড়ানো:

func replaceString(#string:String, #with:String, #start:Int, #length:Int) ->String {
    var startIndex = advance(original.startIndex, start) // Start at the second character
    var endIndex   = advance(startIndex, length) // point ahead two characters
    var range      = Range(start:startIndex, end:endIndex)
    var final = original.stringByReplacingCharactersInRange(range, withString: replacement)
    return final
}

var newString = replaceString(string:original, with:replacement, start:1, length:2)
println("newString:\(newString)")

আউটপুট:

newString: !his is a test

4
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

       let strString = ((textField.text)! as NSString).stringByReplacingCharactersInRange(range, withString: string)

 }

2

সুইফট ২.০ অনুমান করে func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {:

var oldString = textfield.text!
let newRange = oldString.startIndex.advancedBy(range.location)..<oldString.startIndex.advancedBy(range.location + range.length)
let newString = oldString.stringByReplacingCharactersInRange(newRange, withString: string)

1

এখানে আমার সেরা প্রচেষ্টা। তবে এটি ভুল ইনপুট যুক্তিটি চেক বা সনাক্ত করতে পারে না।

extension String {
    /// :r: Must correctly select proper UTF-16 code-unit range. Wrong range will produce wrong result.
    public func convertRangeFromNSRange(r:NSRange) -> Range<String.Index> {
        let a   =   (self as NSString).substringToIndex(r.location)
        let b   =   (self as NSString).substringWithRange(r)

        let n1  =   distance(a.startIndex, a.endIndex)
        let n2  =   distance(b.startIndex, b.endIndex)

        let i1  =   advance(startIndex, n1)
        let i2  =   advance(i1, n2)

        return  Range<String.Index>(start: i1, end: i2)
    }
}

let s   =   "🇪🇸😂"
println(s[s.convertRangeFromNSRange(NSRange(location: 4, length: 2))])      //  Proper range. Produces correct result.
println(s[s.convertRangeFromNSRange(NSRange(location: 0, length: 4))])      //  Proper range. Produces correct result.
println(s[s.convertRangeFromNSRange(NSRange(location: 0, length: 2))])      //  Improper range. Produces wrong result.
println(s[s.convertRangeFromNSRange(NSRange(location: 0, length: 1))])      //  Improper range. Produces wrong result.

ফলাফল.

😂
🇪🇸
🇪🇸
🇪🇸

বিস্তারিত

NSRangeNSStringইউটিএফ -16 কোড-ইউনিট গণনা থেকে । এবং Range<String.Index>সুইফ্ট থেকে Stringএকটি অস্বচ্ছ আপেক্ষিক প্রকার যা কেবল সাম্যতা এবং নেভিগেশন ক্রিয়াকলাপ সরবরাহ করে। এটি ইচ্ছাকৃতভাবে লুকানো নকশা।

যদিও Range<String.Index>ইউটিএফ -16 কোড-ইউনিট অফসেটে ম্যাপ করা হয়েছে বলে মনে হচ্ছে, এটি কেবল একটি বাস্তবায়ন বিশদ এবং আমি কোনও গ্যারান্টি সম্পর্কে কোনও উল্লেখ পাইনি। তার মানে বাস্তবায়নের বিশদ যে কোনও সময় পরিবর্তন করা যেতে পারে। সুইফ্টের অভ্যন্তরীণ প্রতিনিধিত্ব Stringসুন্দরভাবে সংজ্ঞায়িত হয় না এবং আমি এটির উপর নির্ভর করতে পারি না।

NSRangeমানগুলি String.UTF16Viewসূচকে সরাসরি ম্যাপ করা যায় । তবে এটিকে রূপান্তর করার কোনও পদ্ধতি নেইString.Index

সুইফট String.Indexসুইফট পুনরুক্তি করতে সূচি Characterযা হয় ইউনিকোড গ্রাফিম ক্লাস্টার । তারপরে, আপনাকে অবশ্যই সঠিক সরবরাহ করতে হবে NSRangeযা সঠিক গ্রাফেম ক্লাস্টার নির্বাচন করে। আপনি যদি উপরের উদাহরণের মতো ভুল পরিসীমা সরবরাহ করেন তবে এটি ভুল ফলাফল আনবে কারণ সঠিক গ্রাফিয়াম ক্লাস্টার রেঞ্জটি বের করা যায় না।

একটি গ্যারান্টি যে আছে কিনা String.Index হয় হল UTF-16 কোড ইউনিট অফসেট, তারপর সমস্যা সহজ হয়ে যায়। তবে তা হওয়ার সম্ভাবনা নেই।

বিপরীত রূপান্তর

যাইহোক, বিপরীত রূপান্তরটি নির্ভুলভাবে করা যেতে পারে।

extension String {
    /// O(1) if `self` is optimised to use UTF-16.
    /// O(n) otherwise.
    public func convertRangeToNSRange(r:Range<String.Index>) -> NSRange {
        let a   =   substringToIndex(r.startIndex)
        let b   =   substringWithRange(r)

        return  NSRange(location: a.utf16Count, length: b.utf16Count)
    }
}
println(convertRangeToNSRange(s.startIndex..<s.endIndex))
println(convertRangeToNSRange(s.startIndex.successor()..<s.endIndex))

ফলাফল.

(0,6)
(4,2)

সুইফট 2-এ return NSRange(location: a.utf16Count, length: b.utf16Count)অবশ্যই পরিবর্তন করতে হবেreturn NSRange(location: a.utf16.count, length: b.utf16.count)
এলিয়ট

1

আমি খুঁজে পেয়েছি সবচেয়ে পরিষ্কার সুইফট 2 সমাধানটি এনএসআরঞ্জে একটি বিভাগ তৈরি করা:

extension NSRange {
    func stringRangeForText(string: String) -> Range<String.Index> {
        let start = string.startIndex.advancedBy(self.location)
        let end = start.advancedBy(self.length)
        return Range<String.Index>(start: start, end: end)
    }
}

এবং তারপরে এটিকে পাঠ্য ক্ষেত্রের প্রতিনিধি কার্যের জন্য কল করুন:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let range = range.stringRangeForText(textField.text)
    let output = textField.text.stringByReplacingCharactersInRange(range, withString: string)

    // your code goes here....

    return true
}

আমি লক্ষ্য করেছি যে আমার কোডটি সর্বশেষতম সুইফট 2 আপডেটের পরে আর কাজ করছে না। আমি সুইফট 2 এর সাথে কাজ করার জন্য আমার উত্তর আপডেট করেছি।
ড্যানি ব্র্যাভো

0

সুইফট bet.০ বিটা অফিসিয়াল ডকুমেন্টেশন এই পরিস্থিতিতে স্ট্রিং.উইফএফ 16 বিভাগে ইউটিএফ 16 ভিউ এলিমেন্ট ম্যাচ এনএসটিস্ট্রিং অক্ষরের শিরোনামে তার স্ট্যান্ডার্ড সমাধান সরবরাহ করেছে


আপনি যদি আপনার উত্তরে লিঙ্ক সরবরাহ করেন তবে এটি সহায়ক হবে।
এম

0

গৃহীত উত্তরে আমি বিকল্পগুলি জটিল মনে করি। এটি সুইফট 3 এর সাথে কাজ করে এবং ইমোজিদের সাথে কোনও সমস্যা নেই বলে মনে হয়।

func textField(_ textField: UITextField, 
      shouldChangeCharactersIn range: NSRange, 
      replacementString string: String) -> Bool {

  guard let value = textField.text else {return false} // there may be a reason for returning true in this case but I can't think of it
  // now value is a String, not an optional String

  let valueAfterChange = (value as NSString).replacingCharacters(in: range, with: string)
  // valueAfterChange is a String, not an optional String

  // now do whatever processing is required

  return true  // or false, as required
}

0
extension StringProtocol where Index == String.Index {

    func nsRange(of string: String) -> NSRange? {
        guard let range = self.range(of: string) else {  return nil }
        return NSRange(range, in: self)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.