Ich versuche, ein einfaches Dependency Injection-System für unsere App in Swift, für 2 Tage jetzt zu machen. Ich bin flexibel zu welcher Lösung, aber ich möchte etwas, damit ich sagen kann "gib mir eine Instanz von etwas, das diesem Protokoll entspricht" und der tatsächlich zurückgegebene Typ kann was auch immer sein, solange es dem besagten Protokoll entspricht. Ich habe sehr viele Dinge einschließlich Generika versucht, aber gelungen, um herauszufinden, dass das nicht wirklich so jetzt arbeitet ich bin bis auf die nackten Grundlagen, so etwas wie diese (?):Überprüfen Sie, ob Klasse entspricht Protokoll
protocol AProtocol {
}
class AClass: AProtocol {
}
class MyDiThing {
public static func objectConformingTo(aProtocol: Any) -> Any? {
// And here I want to do something like
if AClass is aProtocol {
return AClass()
}
return nil
}
}
// The calling code ..
let aObject = MyDIThing.objectConformingTo(AProtocol)
Es ist nicht schön, ich Wissen Sie, aber im Moment bin ich nicht so wählerisch in Bezug auf Leistung/schlechten Code, solange es das Entkopplungsproblem löst (und vorzugsweise in der MyDIThing-Klasse enthalten sein kann). Wenn das in swift unmöglich ist, bin ich offen für andere Lösungen. Ich habe ähnliche Lösungen mit objective-c mit gutem Erfolg verwendet, nur mit einem Wörterbuch mit Schlüsseln als NSStringFromProtocol und Werten als Klasse, Subskribierung des Wörterbuchs mit dem eingehenden Protokoll und Instanziierung der Klasse. Super einfach. In swift fühlt es sich unmöglich an!
'wenn foo = bar wie? MyProtocol {/ * bar entspricht dem Protokoll ... foo ist vom Typ MyProtocol und die Methoden können darauf aufgerufen werden * /} ' – nhgrif
Ich habe den Registrierungs-basierten schnellen Ansatz mit einer Enum als Schlüssel und einem Closure als Wert gemacht. Funktioniert gut. –