簡體   English   中英

Swift泛型擴展到多個類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM