के रूप में स्विफ्ट 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
}
}
यह विधि एक वैकल्पिक स्ट्रिंग रेंज लौटाती है क्योंकि सभी 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 (Xcode 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)) // 🇩🇪