2016-05-18 5 views
2

UICollectionView.visibleCells()でUICollectionViewCellsの配列をループして、セルがプロトコルに準拠しているかどうかを確認すると、そのセルがUIViewであり、フレームプロパティがあることを忘れてしまいます。Swift forget objectsが型です

for cell in collectionView.visibleCells() { 

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

     let cellPosition2 = cell.frame.origin 

     cell.doAwesome(cellPosition) 
    } 
} 

スウィフトはcellPosition2の設定のコンパイルエラーを与える:

cellPosition1が正常に動作設定
Value of type 'AwesomeCellProtocol' has no member 'frame' 

UIViewとAwesomeCellProtocolの両方をチェックできますか?

あなたがもし、ブロック、 forループの外側のスコープからの「影」 cell変数のスコープの新しい変数 cellを導入

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

+0

Objective-Cのように、現在、クラスタイプとプロトコルタイプを混在させることはできません。 – Sulthan

答えて

2

。 そのローカル変数のタイプはで、 UICollectionViewCellではありません。

あなたが別の名前に結合することによって、その問題を回避することができます:あなたは、オプションをアンラップすると

if let awesomeCell = cell as? AwesomeCellProtocol { 

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

シャドウイングは完璧な意味合いです、ありがとう。 – richy

1

、あなたはそれはもはやあなたが期待するタイプではなく、むしろobjectWithAwesomeCellProtocolことが正しいです。

代わりにas?の代わりにisを使用してみることもできますが、nilケースを自分で処理する必要があります。​​

の下で、Appleのスウィフトプログラミング言語ガイドから

あなたは、プロトコル適合性を確認するために、特定のプロトコルにキャストする型キャストで説明isas演算子を使用することができます。

is演算子は、インスタンスがプロトコルに準拠する場合はtrueを返し、そうでない場合はfalseを返します。

downcast演算子のバージョンは、プロトコルの種類の任意の値を返します。インスタンスがそのプロトコルに準拠していない場合、この値はnilです。

キャストプロセスによって元のオブジェクトは変更されないことに注意してください。ただし、[unwrapped optional]定数に格納されている時点では[protocol]タイプしか知られていません。その[protocol-specific]プロパティにのみアクセスできます。

+0

私はこれを選んだのですが、 'is'を使うと動作しますが、私の場合は、UIViewとAwesomeCellProtocolの両方を参照する必要があります。 – richy