2016-03-31 7 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'を使いたいかもしれません。とにかくこれを 'quickValue = value as let let 'とすることで迅速にキャストできますか?ダブル{...使用} '。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html – Kevin

+0

を参照してください。これは、 'return(fm.stringFromNumber(NSNumber(double:doubleValue))')で動作します。私は知らないが、なぜ私は最後に文字列の値をunwrapする必要がありますか? –

+0

'stringFromNumber(_ :)'はnil以外の値を返すことは保証されていませんが、あなたのメソッドは保証されています。 – avismara

答えて

0

なぜこの場合ジェネリックスを使用する必要がありますか?タイプ情報を保存する必要がある場合にのみ、ジェネリックを使用してください。

のみ使用ジェネリック医薬品:「後であなたのタイプを与えるしようとしていると私は私が指定するどこでもあなたがその タイプを強制したい」

は、

あなたがコンパイラに伝えたいだけ使用Any

「この変数についてはこちらを任意の型を強制する必要が心配しないでは 私は私がやりたいしましょう。」

これで、あなたのユースケースは2番目のケースに適合します。あなたはジェネリックスをここで混乱させたくありません。あなたの解決策は:

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

関連する問題