[英]Swift generics extension to multiple classes
所以我想為NSNumber,Int,Double和Float添加一個通用擴展,其中值被轉換為格式化的String。
我從創建自定義協議開始:
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
現在我正在嘗試將格式添加到擴展名:
extension MyFormatConvertible {
public var toMyFormat: String {
let numberValue = NSNumber(value:self)
....
但這似乎不起作用,因為我得到錯誤:
無法使用類型為'(value:Self)'的參數列表調用類型'NSNumber'的初始值設定項
關於如何解決這個問題的任何提示?
您可以簡單地使用String(describing: self)
來實現這一點。
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
return String(describing: self)
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(1.toMyFormat)
print(1.2.toMyFormat)
print(1.234.toMyFormat)
print(NSNumber(value: 1.23456).toMyFormat)
對於各種數字類型, NSNumber(value:)
有幾個重載,但是沒有通用的NSNumber(value:)
構造函數。
可能的解決方法是使用
func string(for obj: Any?) -> String?
“抽象”超類的函數NumberFormatter
Formatter
接受任何類型的參數(但可能返回nil
):
protocol MyFormatConvertible {
var toMyFormat: String { get }
}
extension MyFormatConvertible {
var toMyFormat: String {
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut // <-- Just for demonstration purposes!!
return formatter.string(for: self) ?? "\(self)"
}
}
extension NSNumber: MyFormatConvertible {}
extension Double: MyFormatConvertible {}
extension Float: MyFormatConvertible {}
extension Int: MyFormatConvertible {}
print(123.toMyFormat) // one hundred twenty-three
print(Float.pi.toMyFormat) // three point one four one five nine two five zero two five nine three nine nine
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.