Swift:在superview中查找视图(没有for循环)

时间:2017-02-04 05:42:54

标签: swift

我正在使用以下代码在我的视图中查找某个子视图。它工作正常,for循环只运行一次,因为它只找到一个满足where子句的子视图。

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
        }
    }
}

其中一种方式计算速度更快吗?

2 个答案:

答案 0 :(得分: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)

first(where: )将为您提供满足条件的数组中的第一个元素(假设您只想在一个元素上执行它,因为它不是“循环”):

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`

一旦找到匹配就会停止,这样就可以获得尽可能高效的效果。实际上,它几乎不重要,因为你往往只有少量的子视图。否则,GPU将首先从必须渲染所有内容中发出。