我知道在第一行中,我们可以使用 lessThanTen(数字:Int) 来替换 (int) < / strong>, contidion 表示标签,但在第三行:*为什么我们不使用 if condition:(item) 替换 if condition(item) ,因为 条件 是标签。
答案 0 :(得分:6)
条件是您在该方法上接收的方法,如果您查看该方法签名:
condition: (int) -> Bool
这意味着你正在接收一个可以使用Int类型的参数调用的条件并返回一个bool。在任何地方,里面:
hasAnyMatches
您将能够使用
condition(anyInt)
现在,如果你看一下方法调用者:
hasAnyMatches(list: numbers, condition: lessThanTen)
所以,你是说&#39;条件&#39; on&#39; hasAnyMatches&#39;将会少于此十分之一。这意味着在你的
中if condition(item)
真正发生的是:
if lessThanTen(item)
我希望它更清楚!
答案 1 :(得分:4)
condition
是一个Bool
- 返回提供给hasAnyMatches
的闭包,需要调用以产生一个布尔值。闭包采用类型为Int
的单个参数,该参数与list
的元素的类型相同。因此,我们在每个项目上调用提供的(Int) -> Bool
闭包,如果condition
应用于项目返回true
,我们会在{{{{}}上切断遍历1}}项目短并从函数返回list
。
使用函数式编程tecniques,我们可以在true
上使用reduce
操作来压缩list
的实现:
hasAnyMatches
或者,甚至更好(允许在原始循环中退出func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
return list.reduce(false) { $0 || condition($1) }
}
),如@Hamish在下面的评论中所描述的那样(谢谢!),使用return
contains
使用示例:
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
return list.contains(where: condition)
}