এর মতো সুইফট 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)) // 🇩🇪