2015-02-11 9 views
5

Ist es möglich, einem optionalen generischen Parameter einen Standardwert zuzuweisen?Standardwert für optionalen generischen Parameter in der Swift-Funktion

Ich versuche, so etwas zu tun:

func addChannel<T>(name: String, data: T? = nil) -> Channel { 

} 

let myChannel = addChannel("myChannelName") 

Aber ich bin immer eine Fehlermeldung,

Argument for generic parameter 'T' could not be inferred

Ist es nur ein Fall von dem, was ich versuche zu Sei es unmöglich?

Antwort

5

Es ist unmöglich in der Art, wie Sie es getan haben. Wenn nur der Code oben angegeben ist, welcher Typ ist T? Der Compiler, wie es heißt, kann es nicht herausfinden (das kann ich auch nicht, und ich nehme an, Sie könnten das auch nicht, weil die Daten nicht da sind).

Die Lösung auf die spezifische Frage ist eher, als Standardeinstellungen verwenden, um eine Überlastung:

func addChannel<T>(name: String, data: T?) -> Channel { ... } 

func addChannel(name: String) -> Channel { ... } 

let myChannel = addChannel("myChannelName") 

Aber es stellt sich die Frage, was Sie hier machen. Sie würden denken, dass Channel sollte Channel<T> sein. Was machst du sonst mit data? Ohne auf Any zurückzugreifen (was Sie unbedingt vermeiden sollten), ist es schwer zu sehen, wie Ihre Funktion irgendetwas anderes tun kann, als data zu ignorieren.

Mit Channel<T> können Sie nur einen Standard verwenden, aber Sie würden die Art zur Verfügung zu stellen haben:

func addChannel<T>(name: String, data: T? = nil) -> Channel<T> { ... } 
let myChannel: Channel<Int> = addChannel("myChannelName") 

Andernfalls würde der Compiler nicht wissen, welche Art von Kanal du machst.

+0

Okay, das macht Sinn - ich habe nur missverstanden, wie man Generika benutzt. Mein Anwendungsfall war, dass 'data' eine beliebige Art von Dictionary, Int oder String sein kann, oder es kann nil sein. Ist dies die bevorzugte Methode, um 'data: AnyObject 'zu erstellen? = nil "und dann Prüfungen für den Datentyp in der Funktion durchführen? – hamchapman

+1

Der bevorzugte Weg, um dies zu tun, ist nicht "irgendeine Art von Dictionary, Int oder String." Bestimmen Sie, um welchen Typ es sich handelt. Dies kann ein "Daten" -Typ sein, der beliebige von diesen enthalten könnte. Sie implementieren das als Enum mit zugehörigen Daten. Auf diese Weise können Sie sicherstellen, dass Sie erhalten, was Sie erwarten, nicht nur "AnyObject". Wenn Sie AnyObject bekommen? In deinem System laufen die Dinge meiner Erfahrung nach sehr schlecht. Selbst wenn das Design-Problem nicht berücksichtigt wird, hasst der Compiler es. –

+0

Weitere Informationen zu Enumerations, die in Swift als Schlüsseltyp verwendet werden, finden Sie unter https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html. –

Verwandte Themen