Swift 语法不清楚
在“Learning Swift”(Wagner)一书中,有一个关于闭包的例子(闭包尤其是作为参数的闭包):Swift 语法不清楚,swift,Swift,在“Learning Swift”(Wagner)一书中,有一个关于闭包的例子(闭包尤其是作为参数的闭包): 那么,为什么在if语句中使用(number:number)语法呢?第二个number: passingTest(number: number) ^^^^^^^ 已添加,因为闭包passingTest的类型是(编号:Int)->Bool。请参见类型中的编号:?指定调用闭包时需要放置的参数标签。之所以将参数标签放在那里,可能是因为作者试图更清楚,但在我看来,已经非常
那么,为什么在if语句中使用(number:number)语法呢?第二个
number:
passingTest(number: number)
^^^^^^^
已添加,因为闭包passingTest
的类型是(编号:Int)->Bool
。请参见类型中的编号:
?指定调用闭包时需要放置的参数标签。之所以将参数标签放在那里,可能是因为作者试图更清楚,但在我看来,已经非常清楚闭包的参数在做什么。另外,标签number
并没有真正增加多少意义。。。所以第一个编号:实际上只是为了“美学”。也许这会让初学者更容易理解
但是,在Swift 4中,您将无法向闭包类型添加参数标签。在Swift 4中,方法如下:
func firstInNumbers(numbers: [Int], passingTest: (Int) -> Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (number: Int) -> Bool -> Int? {
for n in numbers {
if passingTest(number: n) {
return n
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (_ number: Int)->Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
let numbers = [1,2,3,4,5]
func greaterThanThree(_ number: Int) -> Bool {
return number > 3
}
var firstNumber = firstInNumbers(numbers: numbers, passingTest: greaterThanThree)
print(firstNumber)
让您感到困惑的是,闭包的参数名“number”与传递到闭包中的变量相同
//The parameter name "number" here -----------------V
func firstInNumbers(numbers: [Int], passingTest: (number: Int) -> Bool -> Int? {
//And the variable "number" here -\
// V---------------------------/
for number in numbers {
if passingTest(number: number) {
return number
}
}
return nil
}
如果您使用不同的名称,可能会更容易区分,如:
func firstInNumbers(numbers: [Int], passingTest: (Int) -> Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (number: Int) -> Bool -> Int? {
for n in numbers {
if passingTest(number: n) {
return n
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (_ number: Int)->Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
let numbers = [1,2,3,4,5]
func greaterThanThree(_ number: Int) -> Bool {
return number > 3
}
var firstNumber = firstInNumbers(numbers: numbers, passingTest: greaterThanThree)
print(firstNumber)
在Swift 4中,无法标记闭合参数。此外,在最初的帖子中还有一些小的语法错误。更正语法错误,并将闭包示例升级到Swift 4,完整示例如下所示:
func firstInNumbers(numbers: [Int], passingTest: (Int) -> Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (number: Int) -> Bool -> Int? {
for n in numbers {
if passingTest(number: n) {
return n
}
}
return nil
}
func firstInNumbers(numbers: [Int], passingTest: (_ number: Int)->Bool) -> Int? {
for number in numbers {
if passingTest(number) {
return number
}
}
return nil
}
let numbers = [1,2,3,4,5]
func greaterThanThree(_ number: Int) -> Bool {
return number > 3
}
var firstNumber = firstInNumbers(numbers: numbers, passingTest: greaterThanThree)
print(firstNumber)
参数名,如
编号:
,是函数签名的一部分。没有它,代码就无法编译。显然,我不明白第一个“数字”和第二个“数字”到底是什么。第一个数字:
是名称的一部分;第二个number
是上面定义的循环变量的名称。关于第一个数字,“是名称的一部分”是什么?它是passingTest:number:
名称的一部分。只是同一个名字让我困惑。