সুইফট String
রেঞ্জ এবং NSString
রেঞ্জগুলি "সামঞ্জস্যপূর্ণ" নয়। উদাহরণস্বরূপ, like এর মতো ইমোজিগুলি একটি সুইফ্ট চরিত্র হিসাবে গণনা করা হয়, তবে দুটি 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)
আউটপুট:
Ong দীর্ঘ প্যারাগ্রা {
} পিএইচ বলুন {
এনএস কালার = "এনএসক্যালাইব্রেটেড আরজিবিসিওলোরস্পেস 1 0 0 1";
} ING! {
}
আপনি দেখতে পাচ্ছেন, "পিএইচ বলুন" "গুণাবলি" নয়, গুণটি চিহ্নিত করা হয়েছে।
যেহেতু 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)
আউটপুট:
Ong দীর্ঘ অনুচ্ছেদ {
} বলার অপেক্ষা রাখে না {
এনএস কালার = "এনএসক্যালাইব্রেটেড আরজিবিসিওলোরস্পেস 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)