ie kann ich in Swift eine Variable eines bestimmten Typs deklarieren, die einem oder mehreren Protokollen entsprich
In Swift kann ich den Typ einer Variablen explizit festlegen, indem ich sie wie folgt deklariere:
var object: TYPE_NAME
Wenn wir noch einen Schritt weiter gehen und eine Variable deklarieren möchten, die mehreren Protokollen entspricht, können wir dasprotocol
deklarativ:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
Was passiert, wenn ich ein Objekt deklarieren möchte, das einem oder mehreren Protokollen entspricht und auch einen bestimmten Basisklassentyp aufweist? Das Objective-C-Äquivalent würde folgendermaßen aussehen:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
In Swift würde ich erwarten, dass es so aussieht:
var object: TYPE_NAME,ProtocolOne//etc
Dies gibt uns die Flexibilität, mit der Implementierung des Basistyps sowie der im Protokoll definierten zusätzlichen Schnittstelle umgehen zu können.
Gibt es eine andere offensichtliche Möglichkeit, die ich vermissen könnte?
BeispieAls Beispiel: Ich habe einUITableViewCell
Fabrik, die für die Rücksendung von Zellen verantwortlich ist, die einem Protokoll entsprechen. Wir können leicht eine generische Funktion einrichten, die Zellen zurückgibt, die einem Protokoll entsprechen:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
päter möchte ich diese Zellen aus der Warteschlange entfernen und dabei sowohl den Typ als auch das Protokoll nutze
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Dies gibt einen Fehler zurück, da eine Tabellensichtzelle nicht dem Protokoll entspricht ...
Ich möchte angeben können, dass es sich bei der Zelle um ein @ handelUITableViewCell
und entspricht demMyProtocol
in der Variablendeklaration?
Wenn Sie mit dem @ vertraut siFactory Pattern Dies ist sinnvoll, wenn Objekte einer bestimmten Klasse zurückgegeben werden sollen, die eine bestimmte Schnittstelle implementieren.
Genau wie in meinem Beispiel möchten wir manchmal Schnittstellen definieren, die sinnvoll sind, wenn sie auf ein bestimmtes Objekt angewendet werden. Mein Beispiel für die Tabellenzelle ist eine solche Rechtfertigung.
Wenn der gelieferte Typ nicht genau mit der angegebenen Schnittstelle übereinstimmt, das Objekt, das die Factory zurückgibt, und ich daher die Flexibilität bei der Interaktion sowohl mit dem Basisklassentyp als auch mit der deklarierten Protokollschnittstelle möchte