在 Swift 中,NSAttributedString 的字符数比 String 多?
In Swift NSAttributedString has more characters than String?
我正在尝试将属性添加到 Swift 字符串中的某些范围。
我在子字符串中找到了第一个和最后一个符号的范围,并将它们之间的文本(包括)着色为红色。
let mutableString = NSMutableAttributedString(string: text)
let str = mutableString.string
//Red symbols
var t = 0
let symbols = mutableString.string.characters.count
while t < symbols {
if str[t] == "[" {
let startIndex = t
while str[t] != "]" {
t += 1
}
t += 1
let endIndex = t
mutableString.addAttribute(
NSForegroundColorAttributeName,
value: UIColor.redColor(),
range: NSMakeRange(startIndex, endIndex - startIndex))
}
t += 1
}
但我发现 String 和 NSMutableAttributedString 中的范围不相等。 String 中的范围较短(此文本不是 Unicode 编码)。
有什么方法可以找到不在底层字符串中但在 NSAttributedString 中正确找到它的范围吗?
示例:
print(mutableString.length) //550
print(mutableString.string.characters.count) //548
为什么会这样?
是的,可以在 NSMutableAttributedString
中找到范围。
示例:
let text = "[I love Ukraine!]"
var start = text.rangeOfString("[")
var finish = text.rangeOfString("]")
let mutableString = NSMutableAttributedString(string: text)
let startIndex = mutableString.string.rangeOfString("[")
let finishIndex = mutableString.string.rangeOfString("]")
playground 的示例输出:
区分 String 和 NSString,即使它们是相互桥接的。 String 是原生的 Swift,你根据 String 字符索引来定义一个范围。 NSString 是 Cocoa (Foundation),你根据 NSRange.
定义一个范围
是的,我找到了。
Windows 行尾 "\r\n" 在 NSAttributedString 中是两个符号,但在 Swift String 中只有一个字符。
我使用签入我的代码:
let symbols = mutableString.string.characters.count
var extendedSymbols = 0
while t < symbols {
if str[t] == "\r\n" { extendedSymbols += 1 }
else if str[t] == "[" {
let startIndex = t + extendedSymbols
while str[t] != "]" {
t += 1
}
t += 1
let endIndex = t + extendedSymbols
mutableString.addAttribute(
NSForegroundColorAttributeName,
value: UIColor.redColor(),
range: NSMakeRange(startIndex, endIndex - startIndex))
}
t += 1
}
谢谢大家的帮助!!!
我正在尝试将属性添加到 Swift 字符串中的某些范围。 我在子字符串中找到了第一个和最后一个符号的范围,并将它们之间的文本(包括)着色为红色。
let mutableString = NSMutableAttributedString(string: text)
let str = mutableString.string
//Red symbols
var t = 0
let symbols = mutableString.string.characters.count
while t < symbols {
if str[t] == "[" {
let startIndex = t
while str[t] != "]" {
t += 1
}
t += 1
let endIndex = t
mutableString.addAttribute(
NSForegroundColorAttributeName,
value: UIColor.redColor(),
range: NSMakeRange(startIndex, endIndex - startIndex))
}
t += 1
}
但我发现 String 和 NSMutableAttributedString 中的范围不相等。 String 中的范围较短(此文本不是 Unicode 编码)。 有什么方法可以找到不在底层字符串中但在 NSAttributedString 中正确找到它的范围吗?
示例:
print(mutableString.length) //550
print(mutableString.string.characters.count) //548
为什么会这样?
是的,可以在 NSMutableAttributedString
中找到范围。
示例:
let text = "[I love Ukraine!]"
var start = text.rangeOfString("[")
var finish = text.rangeOfString("]")
let mutableString = NSMutableAttributedString(string: text)
let startIndex = mutableString.string.rangeOfString("[")
let finishIndex = mutableString.string.rangeOfString("]")
playground 的示例输出:
区分 String 和 NSString,即使它们是相互桥接的。 String 是原生的 Swift,你根据 String 字符索引来定义一个范围。 NSString 是 Cocoa (Foundation),你根据 NSRange.
定义一个范围是的,我找到了。 Windows 行尾 "\r\n" 在 NSAttributedString 中是两个符号,但在 Swift String 中只有一个字符。 我使用签入我的代码:
let symbols = mutableString.string.characters.count
var extendedSymbols = 0
while t < symbols {
if str[t] == "\r\n" { extendedSymbols += 1 }
else if str[t] == "[" {
let startIndex = t + extendedSymbols
while str[t] != "]" {
t += 1
}
t += 1
let endIndex = t + extendedSymbols
mutableString.addAttribute(
NSForegroundColorAttributeName,
value: UIColor.redColor(),
range: NSMakeRange(startIndex, endIndex - startIndex))
}
t += 1
}
谢谢大家的帮助!!!