如何使用.对String和NSAttributedString都使用泛型类型



我有一个扩展,它将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
}
}

最新更新