2017-02-04 9 views
0

私のビュー内で特定のサブビューを見つけるために、次のコードを使用しています。正常に動作し、forループは1回だけ実行されます。これは、where句を満たすサブビューが1つしか見つからないためです。Swift:スーパービューでのビューの検索(forループなし)

for view in boardView.subviews where (view as? PlayingCardView)?.position.location == source. 
    && (view as! PlayingCardView).position.column == source.column 
    && (view as! PlayingCardView).position.row >= source.row 

しかし実際には何もしていないときに私はここでループを実行しているのが奇妙に思えます。私は何を意味するのか知っていますか?

「検索」する方法はありますか? subviews.index(of:)を使用し、where句などの条件を使用する方法と同様に、


また、私はこのように同じコードを実行することができることを知っている:

for view in boardView.subviews { 
    if let cardView = view as? PlayingCardView { 
     if cardView.position.location == source.location 
     && (view as! PlayingCardView).position.column == source.column 
     && (view as! PlayingCardView).position.row >= source.row { 
      // Do stuff 
     } 
    } 
} 

は計算より速く、次のいずれかの方法か?それは、すぐに停止します

let view = boardView.subviews.first { 
    guard let cardView = $0 as? PlayingCardView else { return false } 
    return cardView.position.location == source.location 
      && cardView.position.column == source.column 
      && cardView.position.row >= source.row 
} 

// do stuffs to `view` 

答えて

1

あなたはfilterメソッドを探していると思います。

if let card = (boardView.subviews as? [PlayingCardView])?.filter({ 
    return $0.position.location == source.location 
     && $0.position.column == source.column 
     && $0.position.row >= source.row 
}).first { 
    // Do stuff 
    print(card) 
} 

それとも、あなたの引数を満たす最初のカードを見つけたい場合、あなたはfirstメソッドを使用することができます。

if let card = (boardView.subviews as? [PlayingCardView])?.first(where: { 
    return $0.position.location == source.location 
     && $0.position.column == source.column 
     && $0.position.row >= source.row 
}) { 
    // Do stuff 
    print(card) 
} 
+1

ありがとうございます、これはかなり完璧ですね! –

+0

これは完璧なようです...しかし、私はエラーが発生しています: –

+0

何がエラーですか? – Callam

0

first(where:)はあなた(あなただけそれが「愚か」ではありませんので、一つの要素でそれをしたいと仮定して)条件を満たし配列の最初の要素を与えますマッチが見つかったので、それはあなたが得ることができるほど効率的です。実際には、サブビューの数が少ない傾向があるため、ほとんど問題になりません。さもなければ、GPUはそれらの全てをレンダリングしなければならないことを最初に諦めます。

関連する問題