我正在使用以下代码在我的视图中查找某个子视图。它工作正常,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
}
}
}
其中一种方式计算速度更快吗?
答案 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将首先从必须渲染所有内容中发出。