स्विफ्ट 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)