我是Swift的新手,刚刚在Xcode游乐场开始了Swift Tour(我觉得很棒!)。在“函数和闭包”一节中,有一个简单的函数,给定一个整数数组和类型Int -> Bool
的谓词,检查数组中是否有满足谓词的整数。
func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
到目前为止一切顺利。现在我想使用hasAnyMatches
和一个匿名函数(“closure”)来编写第二个函数allMatch
,它检查数组中的所有整数是否满足谓词。这就是我试过的:
func allMatch(list: [Int], p: Int -> Bool) -> Bool {
return !(hasAnyMatches(list, condition : ({(n : Int) in return !(p(n))})))
}
这个想法很明确:如果没有元素在否定谓词上返回值true
,那么所有元素都满足谓词。但是,语法有问题,我无法弄清楚是什么。 allMatch
的定义有什么问题?
更新
感谢您的意见!好的,上面的定义没有太大的错误(在Swift 2.0,Xcode 7 beta中),但它可以写得更简洁,请参阅下面的答案。我的问题出现在allMatch
的以下调用中。首先,这很好:
var numbers = [0,2,4,6]
func isEven(n: Int) -> Bool {
return (n % 2) == 0
}
allMatch(numbers, p: isEven)
但是当我内联isEven
函数时,如下所示:
allMatch(numbers, p: { n in return (n % 2) == 0 } )
然后我在侧栏中得到的信息是“5次”。
答案 0 :(得分:1)
我建议您阅读并努力了解Xcode告诉您的错误。 编译器提供了一个非常具体的错误消息,在这种情况下(以及许多其他人)甚至提供了为您修复它的提议。
在某些时候(我认为它是2,但这是1.2),Swift在独立函数中删除了参数标签,以便更自然地使用C函数。
作为一种风格笔记,正如我在评论中提到的,你有更多的括号,而不是你需要的。你最好用这样的东西:
return !hasAnyMatches(list) { n in return !p(n) }