स्विफ्ट Stringपर्वतमाला और NSStringपर्वतमाला "संगत" नहीं हैं। उदाहरण के लिए, एक इमोजी जैसे character एक स्विफ्ट चरित्र के रूप में गिना जाता है, लेकिन दो NSString
पात्रों के रूप में (तथाकथित यूटीएफ -16 सरोगेट जोड़ी)।
इसलिए आपके सुझाए गए समाधान अप्रत्याशित परिणाम उत्पन्न करेंगे यदि स्ट्रिंग में ऐसे वर्ण हैं। उदाहरण:
let text = "😄😄😄Long paragraph saying!"
let textRange = text.startIndex..<text.endIndex
let attributedString = NSMutableAttributedString(string: text)
text.enumerateSubstringsInRange(textRange, options: NSStringEnumerationOptions.ByWords, { (substring, substringRange, enclosingRange, stop) -> () in
let start = distance(text.startIndex, substringRange.startIndex)
let length = distance(substringRange.startIndex, substringRange.endIndex)
let range = NSMakeRange(start, length)
if (substring == "saying") {
attributedString.addAttribute(NSForegroundColorAttributeName, value: NSColor.redColor(), range: range)
}
})
println(attributedString)
आउटपुट:
😄😄😄लंग परागरा {
} ph कहते हैं {
NSColor = "NSCalibratedRGBColorSpace 1 0 0 1";
} आईएनजी! {
}
जैसा कि आप देखते हैं, "ph say" को विशेषता के साथ चिह्नित किया गया है, न कि "कह"।
के बाद से NS(Mutable)AttributedStringअंत में एक की आवश्यकता है NSStringऔर एक NSRange, यह वास्तव में करने के लिए दिया स्ट्रिंग परिवर्तित करने के लिए बेहतर है NSStringपहले। फिर substringRange
एक है NSRangeऔर आपको अब और रेंज नहीं बदलनी हैं:
let text = "😄😄😄Long paragraph saying!"
let nsText = text as NSString
let textRange = NSMakeRange(0, nsText.length)
let attributedString = NSMutableAttributedString(string: nsText)
nsText.enumerateSubstringsInRange(textRange, options: NSStringEnumerationOptions.ByWords, { (substring, substringRange, enclosingRange, stop) -> () in
if (substring == "saying") {
attributedString.addAttribute(NSForegroundColorAttributeName, value: NSColor.redColor(), range: substringRange)
}
})
println(attributedString)
आउटपुट:
😄😄😄लॉन्ग पैरा {
}कह रही है{
NSColor = "NSCalibratedRGBColorSpace 1 0 0 1";
}! {
}
स्विफ्ट 2 के लिए अपडेट:
let text = "😄😄😄Long paragraph saying!"
let nsText = text as NSString
let textRange = NSMakeRange(0, nsText.length)
let attributedString = NSMutableAttributedString(string: text)
nsText.enumerateSubstringsInRange(textRange, options: .ByWords, usingBlock: {
(substring, substringRange, _, _) in
if (substring == "saying") {
attributedString.addAttribute(NSForegroundColorAttributeName, value: NSColor.redColor(), range: substringRange)
}
})
print(attributedString)
स्विफ्ट 3 के लिए अपडेट:
let text = "😄😄😄Long paragraph saying!"
let nsText = text as NSString
let textRange = NSMakeRange(0, nsText.length)
let attributedString = NSMutableAttributedString(string: text)
nsText.enumerateSubstrings(in: textRange, options: .byWords, using: {
(substring, substringRange, _, _) in
if (substring == "saying") {
attributedString.addAttribute(NSForegroundColorAttributeName, value: NSColor.red, range: substringRange)
}
})
print(attributedString)
स्विफ्ट 4 के लिए अपडेट:
स्विफ्ट 4 (एक्सकोड 9) के रूप में, स्विफ्ट मानक पुस्तकालय के बीच Range<String.Index>और में बदलने के लिए विधि प्रदान करता है NSRange। परिवर्तित करना NSStringअब आवश्यक नहीं है:
let text = "😄😄😄Long paragraph saying!"
let attributedString = NSMutableAttributedString(string: text)
text.enumerateSubstrings(in: text.startIndex..<text.endIndex, options: .byWords) {
(substring, substringRange, _, _) in
if substring == "saying" {
attributedString.addAttribute(.foregroundColor, value: NSColor.red,
range: NSRange(substringRange, in: text))
}
}
print(attributedString)
यहाँ substringRangeएक है Range<String.Index>, और उस के NSRangeसाथ इसी में परिवर्तित किया गया है
NSRange(substringRange, in: text)