在Swift中使用闭包

时间:2015-07-11 22:33:22

标签: swift closures

我是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次”。

1 个答案:

答案 0 :(得分:1)

我建议您阅读并努力了解Xcode告诉您的错误。 编译器提供了一个非常具体的错误消息,在这种情况下(以及许多其他人)甚至提供了为您修复它的提议。

issue

在某些时候(我认为它是2,但这是1.2),Swift在独立函数中删除了参数标签,以便更自然地使用C函数。

作为一种风格笔记,正如我在评论中提到的,你有更多的括号,而不是你需要的。你最好用这样的东西:

return !hasAnyMatches(list) { n in return !p(n) }