2016-03-31 4 views
1

kann nicht verstehen, wie die Arten von Generika zu behandeln und wie die Argumente mit den undefinierten Typen mit Bibliotheken zu verwenden:„Can not Werte vom Typ‚T‘konvertieren ...“ in Generika

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

Sie möchten 'Any' anstelle einer generischen Methode verwenden. Wie auch immer, du schaltest schnell ein, indem du 'if doubleValue = value as? Double {... benutze} '. Siehe https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html – Kevin

+0

es funktioniert mit 'return (fm.stringFromNumber (NSNumber (double: doubleValue))!)'. Ich weiß nicht, aber warum sollte ich am Ende String Wert auspacken? –

+0

Weil 'stringFromNumber (_ :)' nicht garantiert einen Nicht-Null-Wert zurückgibt, aber Ihre Methode ist. – avismara

Antwort

0

Warum Müssen Sie in diesem Fall Generika verwenden? Verwenden Sie Generika nur, wenn Sie Typinformationen erhalten müssen.

Verwenden Generika nur dann, wenn:

„Sie gehen Sie später eine Art zu geben, und ich möchte Ihnen die Typ erzwingen überall, wo ich an.“

Verwenden Any nur, wenn Sie den Compiler sagen wollen: „Sie nicht über diese Variable hier jede Art ich tun lassen erzwingen keinen Grundes zur Sorge, was ich will“

Mit diesem gesagt passt Ihr Anwendungsfall der zweite. Du willst dich hier nicht mit Generika anlegen. Ihre Lösung sollte gehen:

+0

Nicht 'return (fm.stringFromNumber (doubleValue))!' Aber 'return (fm.stringFromNumber (doubleValue)!)' –

+0

Beide sind in Ordnung. Sie können sogar die äußeren Klammern verlieren. Im Gegensatz zu anderen Sprachen wird es in Swift nicht angewendet. :) – avismara

Verwandte Themen