Swift 语法不清楚

Swift 语法不清楚,swift,Swift,在“Learning Swift”(Wagner)一书中,有一个关于闭包的例子(闭包尤其是作为参数的闭包): 那么,为什么在if语句中使用(number:number)语法呢?第二个number: passingTest(number: number) ^^^^^^^ 已添加,因为闭包passingTest的类型是(编号:Int)->Bool。请参见类型中的编号:?指定调用闭包时需要放置的参数标签。之所以将参数标签放在那里,可能是因为作者试图更清楚,但在我看来,已经非常

在“Learning Swift”(Wagner)一书中,有一个关于闭包的例子(闭包尤其是作为参数的闭包):


那么,为什么在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:
名称的一部分。只是同一个名字让我困惑。