Swift:一个函数作为另一个函数参数

时间:2015-09-05 21:50:57

标签: swift swift2

编辑:我知道我现在正在为Swift 2使用错误的Xcode版本。问题解决了。

我正在关注Apple的Swift 2书。在某一点上,有以下示例:

    import Foundation

func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}

func lessThanTen(number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen)

我认为最后一行是奇怪的。为什么会说condition: lessThanTen而不只是lessThanTen?我的编译器(Xcode)也给出了一个错误,就像书中所示的那样。

另外:为什么它只在第三行说list: [Int]condition: Int -> Bool?为什么不像list: [Int] -> Int

3 个答案:

答案 0 :(得分:2)

Swift函数和方法可以将它们的参数定义为具有外部名称。

  

默认情况下,第一个参数省略其外部名称,而   第二个和后续参数使用其本地名称作为他们的   外部名称。

摘录自:Apple Inc.“The Swift Programming Language(Swift 2 Prerelease)。”iBooks。 https://itun.es/us/k5SW7.l

标记condition:是您传递给hasAnyMatches函数的闭包的外部名称。

该代码应该编译并运行。

答案 1 :(得分:2)

  

我的编译器(Xcode)也以错误的方式给我一个错误。

因为语言已经改变了!在您正在阅读的Swift 2中,该功能有[('foo' ,[1, 4, 7 ]), ('bar', [2]), ('baz', [2, 5, 8, 9 )] ,因此您的通话必须为condition:。但是你在Swift 1.2中进行测试,这是一种非常不同的语言,规则不一样。

在Swift 1.2中,使用condition:声明的顶级函数意味着您的的调用应具有condition:。在Swift 1.2中,要求调用condition:,函数声明必须说condition:

你自己很困惑。更新Xcode,以便您使用的语言与您正在阅读的语言相同。

答案 2 :(得分:1)

  1. 它说condition: lessThanTen因为在Swift中你可以定义&#34;标签&#34;,即函数调用所需数据的描述。它给你一个错误,因为如果函数声明是func hasAnyMatches(list: [Int], #condition: Int -> Bool) -> Bool,调用将是正确的(至少Swift 1.2就是这种情况)。在每次调用函数时,数字符号都会生成一个与函数参数名称相同的标签。不得从通话中删除所述标签,因为它可以向调用该功能的人说明该参数的用途。
  2. list: [Int]表示第一个函数参数采用名称&#34; list&#34;并且是[Int]类型。 condition: Int -> Bool表示第二个函数参数采用名称&#34; condition&#34;并且类型为&#34; Int to Bool&#34;,即condition是一个函数,它接受类型Int的单个参数并返回类型Bool的值。实际上,如果你读到最后一行,在调用函数hasAnyMatches时会传递以下内容:i)Ints数组和ii)一个IntBool的函数返回mov eax, 0 // interrupt code mov ebx, 0 // argument, in this case: return value int 0x80 (注意,当函数作为参数传递时,我们只写出他们的名字 - 没有括号)。