我有一个扩展,它将bold
设置为String
。
extension NSAttributedString {
convenience init(format: NSAttributedString, makeBold: [String], regularText: [String]) {
let mutableString = NSMutableAttributedString(attributedString: format)
makeBold.forEach { string in
let range = NSString(string: mutableString.string).range(of: "%bold%")
let attributedString = NSAttributedString(string: string, attributes: [.font: UIFont.openSans(style: .bold, size: 15)])
mutableString.replaceCharacters(in: range, with: attributedString)
}
regularText.forEach { text in
let textRange = NSString(string: mutableString.string).range(of: "%regular%")
mutableString.replaceCharacters(in: textRange, with: text)
}
self.init(attributedString: mutableString)
}
}
它工作正常,但我需要regularText: [String]
才能接受[NSAttributedString]
。我试着这样做:
convenience init<T>(format: NSAttributedString, makeBold: [String], regularText: [T])
但这给了我一个错误:
mutableString.replaceCharacters(in: textRange, with: text)
带有错误文本
对实例方法"replaceCharacters(in:with:("的调用中没有完全匹配
由于不太熟悉generics
,我不知道如何实现这一点。任何帮助都会得到通知。
我在这里读到Swift 中的实例调用方法错误消息中没有完全匹配
这是一个使用错误类型的常见错误,所以我想我没有得到正确的generics
。
EDIT如果我将regularText
类型从String
更改为NSAttributedString
,它可以正常工作,没有任何错误,那么为什么泛型不能同时适用于两者呢?
UPDATE(见注释(:添加另一个方便的init
convenience init(format: NSAttributedString, makeBold: [String], regularText: [NSAttributedString]) {
self.init(format: format, makeBold: makeBold, regularText: regularText.map{ $0.string })
}
或只需添加另一个方便的init
convenience init(format: NSAttributedString, makeBold: [String], regularText: [NSAttributedString]) {
self.init(format: format, makeBold: makeBold, regularText: regularText.asStringArray)
}
和像这样的扩展
extension Array where Element: NSAttributedString {
var asStringArray: [String] {
var strings: [String] = []
self.forEach { text in
strings.append(text.string)
}
return strings
}
}