带有 2 个换行符的 NSmutablestring 使程序崩溃
NSmutablestring with 2 line breaks crash the program
我需要创建一个以换行符开头的 Nsmutableattributed 字符串,代码如下:
let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateMutableString = NSMutableAttributedString.init(string: "\n\(dateString)")
let range = NSRange(location: 0, length: (dateString.count + 2))
dateMutableString.addAttributes([NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray], range: range)
如果我只用一个 \n 开始字符串,它会使 addattributes 行上的程序崩溃,但如果我使用 \n\n 则它不会破坏程序。我能知道这里到底发生了什么吗?
如果只有一个额外字符,则 dateString.count + 2
比字符串长,您会因为范围无效而崩溃。
为什么范围长度基于 dateString.count + 2
?为什么不构建你想要的字符串,然后将该字符串传递给 NSMutableAttributedString
初始值设定项?然后你可以直接得到那个字符串的长度。为什么不将所需的属性传递给初始化程序,因为无论如何您都希望将它们应用于整个字符串?
除此之外,在使用 NSString
或 NSAttributedString
时,您不能在 Swift 字符串上使用 count
来获取长度。您需要使用 dateString.utf16.count
。这是因为 NSRange
for NSString
和 NSAttributedString
是基于 16 位字符的。
这是创建属性字符串的更简单方法,其中属性应用于整个字符串:
let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateAttributes = [NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray]
let dateMutableString = NSMutableAttributedString(string: "\n\(dateString)", attributes: dateAttributes)
我需要创建一个以换行符开头的 Nsmutableattributed 字符串,代码如下:
let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateMutableString = NSMutableAttributedString.init(string: "\n\(dateString)")
let range = NSRange(location: 0, length: (dateString.count + 2))
dateMutableString.addAttributes([NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray], range: range)
如果我只用一个 \n 开始字符串,它会使 addattributes 行上的程序崩溃,但如果我使用 \n\n 则它不会破坏程序。我能知道这里到底发生了什么吗?
如果只有一个额外字符,则 dateString.count + 2
比字符串长,您会因为范围无效而崩溃。
为什么范围长度基于 dateString.count + 2
?为什么不构建你想要的字符串,然后将该字符串传递给 NSMutableAttributedString
初始值设定项?然后你可以直接得到那个字符串的长度。为什么不将所需的属性传递给初始化程序,因为无论如何您都希望将它们应用于整个字符串?
除此之外,在使用 NSString
或 NSAttributedString
时,您不能在 Swift 字符串上使用 count
来获取长度。您需要使用 dateString.utf16.count
。这是因为 NSRange
for NSString
和 NSAttributedString
是基于 16 位字符的。
这是创建属性字符串的更简单方法,其中属性应用于整个字符串:
let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateAttributes = [NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray]
let dateMutableString = NSMutableAttributedString(string: "\n\(dateString)", attributes: dateAttributes)