2016-05-18 4 views
2

Beim Durchlaufen eines Arrays von UICollectionViewCells in UICollectionView.visibleCells() dann überprüft, ob die Zelle mit einem Protokoll übereinstimmt, es vergisst, dass die Zelle eine UIView ist und eine Rahmeneigenschaft hat.Swift-Forget-Objekte sind ein Typ

for cell in collectionView.visibleCells() { 

    let cellPosition1 = cell.frame.origin 
    if let cell = cell as? AwesomeCellProtocol { 

     let cellPosition2 = cell.frame.origin 

     cell.doAwesome(cellPosition) 
    } 
} 

geben Swift einen Compiler-Fehler auf Einstellung cellPosition2:

Value of type 'AwesomeCellProtocol' has no member 'frame' 

Einstellung cellPosition1 gut funktioniert.

Kann ich nach UIView und AwesomeCellProtocol suchen?

+0

Sie können derzeit keine Mischung aus Klassen- und Protokolltyp wie in Objective-C erstellen. – Sulthan

Antwort

2

Mit

if let cell = cell as? AwesomeCellProtocol { ... } 

führen Sie eine neue Variable cell für den Umfang des if-Block, welche "Schatten" der cell Variable aus dem äußeren Umfang der for-Schleife. Diese lokale Variable hat den Typ AwesomeCellProtocol und nicht UICollectionViewCell.

können Sie dieses Problem vermeiden, in einen anderen Namen durch Bindung:

if let awesomeCell = cell as? AwesomeCellProtocol { 

    let cellPosition2 = cell.frame.origin 
    awesomeCell.doAwesome(cellPosition) 
} 
+0

Die Shadowing macht Sinn, danke. – richy

1

Wenn Sie die optionale auspacken, sind Sie richtig, dass es nicht mehr der Typ Sie erwarten, sondern objectWithAwesomeCellProtocol.

Wenn Sie es stattdessen als UICollectionViewCell beibehalten möchten, können Sie versuchen, is anstelle von as? zu verwenden, aber dann müssen Sie nil Fälle selbst behandeln.

Von Swift Programming Language Guide von Apple unter "Checking for Protocol Conformance"

können Sie die is und as Operatoren in Type Casting beschrieben verwenden für Protokollkonformität zu überprüfen, und zu einem bestimmten Protokoll zu werfen.

Der Operator is gibt true zurück, wenn eine Instanz einem Protokoll entspricht und false zurückgegeben wird, wenn dies nicht der Fall ist.

Die as? Version des Downcast-Operators gibt einen optionalen Wert des Protokolltyps zurück, und dieser Wert ist nil, wenn die Instanz diesem Protokoll nicht entspricht.

Beachten Sie, dass die zugrunde liegenden Objekte werden nicht durch den Gießprozess verändert ... Aber in dem Punkt, dass sie in der [ungeöffneten optional] Konstante gespeichert sind, sind sie bekannt nur vom Typ sein [Protokoll], und so es kann nur auf ihre [protokollspezifische] Eigenschaft zugegriffen werden.

+0

Ich hätte das ausgewählt, weil die Verwendung von "is" funktionieren würde, aber in meinem Fall muss ich die Zelle sowohl als UIView als auch als AwesomeCellProtocol bezeichnen, nicht nur nach ihnen suchen, danke trotzdem. – richy