Ich möchte ein Protokoll mit einer Methode erstellen, die eine generische Eingabe verwendet und einen generischen Wert zurückgibt.
Dies ist, was ich bisher versucht habe, aber es erzeugt den Syntaxfehler.
Verwendung der nicht deklarierten Kennung T.
Was mache ich falsch?
protocol ApiMapperProtocol {
func MapFromSource(T) -> U
}
class UserMapper: NSObject, ApiMapperProtocol {
func MapFromSource(data: NSDictionary) -> UserModel {
var user = UserModel() as UserModel
var accountsData:NSArray = data["Accounts"] as NSArray
return user
}
}
Antworten:
Bei Protokollen ist das etwas anders. Schauen Sie sich "Zugehörige Typen" in der Apple-Dokumentation an .
So verwenden Sie es in Ihrem Beispiel
quelle
x
es lokal ist, müssen Sie seinen Typ nicht explizit angebenlet x = UserMapper()
.Um die Antwort von Lou Franco ein wenig zu
ApiMapperProtocol
erläutern: Wenn Sie eine Methode erstellen möchten , die eine bestimmte Methode verwendet , tun Sie dies folgendermaßen:UsesApiMapperProtocol
wird jetzt garantiert nurSourceType
s akzeptiert, die mit den folgenden kompatibel sindApiMapperProtocol
:quelle
as!
statt nuras
in Swift 1.2 zu verwenden? Zweitens: Können Sie mir sagen, warum wir in der Klasse, die dem Protokoll entspricht ,type alias
erneut definieren müssen (dhtypealias T = NSDictionary typealias U = UserModel
)? Danke im Voraus.as
zu gewechselt sindas!
. Überprüfen Sie die Devforen.typealias T=NSDictionary
undtypealias U=UserModel
sind nicht erforderlich. Ich habe das Beispiel aktualisiert, um dies widerzuspiegeln.Um zu erreichen, dass Generika vorhanden sind und auch so deklariert
let userMapper: ApiMapperProtocol = UserMapper()
werden, muss eine generische Klasse vorhanden sein, die dem Protokoll entspricht, das ein generisches Element zurückgibt.Jetzt können Sie auch
userMapper
als solche bezeichnenApiMapper
, die eine spezifische Implementierung haben in RichtungUserMapper
:quelle
userMapper
.Sie können Vorlagenmethoden mit Typlöschung verwenden ...
quelle