Ich möchte eine Zuordnung von Protokollen zu Objekten erstellen, die diese Protokolle implementieren. Dann möchte ich eine Implementierung für ein bestimmtes Protokoll bekommen können. DieseWie gebe ich einen Wert aus einer generischen Funktion als Implementierung eines Protokolls zurück?
ist das, was ich bisher habe:
class Services {
var map = NSMapTable(keyOptions: .CopyIn, valueOptions: .WeakMemory)
func register<T>(type: T, target: AnyObject) {
map.setObject(target, forKey: String(type))
}
func get<T>(type: T) -> AnyObject {
guard let target = map.objectForKey(String(type)) else {
fatalError("Not registered")
}
return target
}
}
Und ich kann es so nennen:
protocol Foo {
func qux()
}
class Bar: Foo {
func qux() {}
}
services.register(Foo.self, target: Bar())
Und das ist großartig. Aber wenn ich will, um es abzurufen:
let foo: Foo = services.get(Foo.self)
... die obige Zeile erzeugt einen Fehler:
Foo.swift:12:34: Cannot convert call result type 'AnyObject' to expected type 'Foo'
Wie kann ich die generische Funktion angeben get
ein Objekt zurückgibt, die das Protokoll in T
verwiesen implementiert ?
Ich möchte vermeiden, bei dem Anruf zu müssen.
Funktioniert T.Type für eine Protokoll? –
@i_am_jorf, kann von vielen Dingen abhängen. Aber ich kann Ihnen versichern, dass 'services.register (Foo.self, target: Bar())' wie erwartet mit Ihrer Klasse und Ihrem Protokoll funktioniert. Bitte versuche. – OOPer