我需要创建一个以换行符开头的Nsmutableattributed String,代码如下:
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,它将不会中断程序。我能知道这里到底发生了什么吗?
答案 0 :(得分:1)
如果只有一个多余的字符,则dateString.count + 2
比字符串长,并且由于范围无效而导致崩溃。
为什么范围长度基于dateString.count + 2
?为什么不构建所需的字符串,然后将该字符串传递给NSMutableAttributedString
初始化程序?然后,您可以直接获取该字符串的长度。又为什么不将所需的属性传递给初始化程序,因为您还是希望将它们应用于整个字符串?
除此之外,在使用count
或NSString
时,不能在Swift字符串上使用NSAttributedString
来获取长度。您需要使用dateString.utf16.count
。这是因为NSRange
和NSString
的{{1}}是基于16位字符的。
这里是创建属性字符串的一种简单方法,其中将属性应用于整个字符串:
NSAttributedString