编辑:我知道我现在正在为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
?
答案 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)
condition: lessThanTen
因为在Swift中你可以定义&#34;标签&#34;,即函数调用所需数据的描述。它给你一个错误,因为如果函数声明是func hasAnyMatches(list: [Int], #condition: Int -> Bool) -> Bool
,调用将是正确的(至少Swift 1.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)一个Int
和Bool
的函数返回mov eax, 0 // interrupt code
mov ebx, 0 // argument, in this case: return value
int 0x80
(注意,当函数作为参数传递时,我们只写出他们的名字 - 没有括号)。