Überprüfen Sie, ob-Klasse entspricht-Protokoll
Ich versuche, eine einfache Dependency-Injection-system für unsere app in swift, für 2 Tage jetzt. Ich bin flexibel, was die Lösung aber ich möchte so etwas kann ich sagen: "geben Sie mir ein Beispiel von etwas, das in Einklang mit diesem Protokoll" und der tatsächliche Typ zurückgegeben werden kann, wie auch immer, solang es entspricht dem Protokoll. Ich habe versucht, eine große viele Dinge, einschließlich Generika, konnte aber herausfinden, dass es nicht(?) wirklich arbeiten, so jetzt bin ich runter auf die nackten Grundlagen, so etwas wie dieses:
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 weiß, aber jetzt bin ich nicht wählerisch, Leistung/schlechten code, solange er löst das Problem der Entkopplung von problem (und am besten eingedämmt werden kann, in der MyDIThing Klasse). Wenn dies nicht möglich ist in swift ich bin offen für andere Lösungen. Ich habe ähnliche Lösungen mit objective-c mit gutem Erfolg, nur mit einem Wörterbuch mit Schlüssel NSStringFromProtocol und Werte, die Klasse, die dictionary-subscripting mit inbound protocol (eingangsprotokoll) und Instanziierung der Klasse. Super einfach. In swift fühlt es sich unmöglich!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim importieren von obj-c, dann können Sie etwas tun, wie Sie es gewohnt waren.
Sonst, es ist schwer, weil die Protokolle nicht vorhanden sind in der gleichen Weise. Betrachten Sie eine Registrierung basiertes system für Ihr Werk. Jede Ihrer Klassen registrieren sich, indem Sie eine Funktion angeben oder die Schließung, die aufgerufen werden können, um wieder eine neue Instanz der Klasse, und die Anmeldung ist gegen eine Zeichenfolge oder eine andere Art von Bezeichner. Dies ist, wo es gut wäre, ein Protokoll-Typ, aber in obj-c, Sie waren wirklich das gleiche tun mit einem string-Konvertierung. Sie konnten sich gegen alles, was
Equatable
um die Dinge sehr allgemein.if let foo = bar as? MyProtocol { /* bar conforms to protocol... foo is of type MyProtocol and the methods can be called on it */ }
Den Kommentar gegeben durch nhgrif ist die richtige Antwort für Swift 2.
Sollten Sie eine optionale Bindung:
Diese
if let something = obj as? type
- Anweisung aufgerufen wird optional mit Bindung und überprüft, ob die Objekt-Typ-gegossen, um den bestimmten Typ/Klasse/Protokoll/....Wenn das so ist, kann man mit dem optionalen (
as?
) oder Kraft packen (as!
) das Objekt.Diese Funktion perfekt erfüllen Ihre Anforderung:
bool _swift_typeIsTargetType(id sourceType, id targetType)
Überprüfen zu können, ob eine swift-Typ ist der Ziel-Typ (ist der gleiche Typ oder eine Unterklasse, oder entspricht das Ziel protocol), funktioniert wie
is
Betreiber von swift. Aber es ist für einen Typ nicht für eine Instanz:Es nutzt private APIs in
libswiftCore.dylib
Siehe swift-Quellcode Casting.cpp:Optionale Bindung ist nicht dasselbe. Es können auch prüfen, Konformität, aber Sie können nicht dynamisch geben Sie den Typ zu überprüfen:
Diese Funktion wird verwendet, in ZIKRouter. Es ist ein Modul router und auch ein Dependency-Injection-framework. Es nutzt Protokoll zu entdecken, Module und Abhängigkeiten injizieren. Sie können es versuchen, wenn Sie wollen, etwas zu tun, wie 'Suche nach einem Modul gemäß eines Protokolls'.