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?

Beispie

Als 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?

Rechtfertigun

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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage