2016-03-31 33 views
1

無法理解如何對待各類仿製藥,以及如何與圖書館與未定義的類型使用的參數:「無法將類型‘T’......的價值」,在仿製藥

func cellWith<T>(value: T) -> String {   // I expect Int, Double or String 
               // type value as argument 

    let fm = NSNumberFormatter()    // Double type argument will be 
    fm.numberStyle = .CurrencyStyle   // processed like "currency" 

    if value.self is Double {    // In case value have type "Double", 
              // like 20_000.00 
     return(fm.stringFromNumber(value)) // I expect return $20,000.00 
            ^~~~~ 
// ERROR: Cannot convert value of type 'T' to expected argument type 'NSNumber' 

    } else { 
     return("bla-bla-bla") 
    } 
} 
+2

您可能想使用'Any'而不是通用方法。無論如何,通過這樣做,如果讓doubleValue = value爲?雙{...使用}'。請參閱https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html – Kevin

+0

它適用於'return(fm.stringFromNumber(NSNumber(double:doubleValue))!)'。我不知道,但爲什麼我應該在最後解開字符串值? –

+0

因爲'stringFromNumber(_ :)'不能保證返回一個非零值,但是你的方法是。 – avismara

回答

0

爲什麼在這種情況下你必須使用泛型嗎?只有在必須保存類型信息時才使用泛型。

使用泛型只有當:

「你打算以後給你一個類型,我希望你能強制執行 類型,我到處都指定。」

使用Any只有當你想告訴編譯器:

「不要擔心這個變量沒必要強制這裏的任何類型讓 我做任何我想要。」

就是說,你的用例適合第二個。你不想在這裏混淆泛型。您的解決方案應該如下:

func cellWith(value: Any) -> String { 
    let fm = NSNumberFormatter() 
    fm.numberStyle = .CurrencyStyle 
    if let doubleValue = value as? Double { 
     return(fm.stringFromNumber(doubleValue))! 
    } else { 
     return("bla-bla-bla") 
    } 
} 
+0

不是'return(fm.stringFromNumber(doubleValue))!'但是'return(fm.stringFromNumber(doubleValue)!)' –

+0

兩者都很好。你甚至可以失去外部的括號。它不是像其他語言一樣在Swift中強制執行。 :) – avismara