我创建了一个传递整数和布尔方法作为参数的方法(此方法需要一个整数作为参数)。当我调用这个方法并传递整数和布尔方法时,代码工作而不需要我在布尔方法中传递整数,为什么会这样?
(以下代码不是我自己的代码,取自Apple对Swift资源的介绍)
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,2,30,12]
hasAnyMatches(list: numbers, condition: lessThanTen)
例如在这种情况下,lessThanTen需要一个整数作为参数传递,但是当我调用hasAnyMatches时,我没有将整数传递给lessThanTen。为什么尽管如此,代码仍然有效?
答案 0 :(得分:2)
您需要先了解 的方法/功能参考。
通常当初学者教授功能时,有些人会使用功能机器类比。希望你听说过这个。功能就像一台机器。它需要一些输入(参数),处理输入,并吐出一些东西(返回值)。并且程序中有很多这样的机器。
在这个类比中,函数引用就像一个指向功能机器所在位置的箭头。就像说“这台机器!”或者“那边的机器!”。
那你为什么不需要这些参数?
因为函数的参数由带有函数引用的函数提供。如果参数是由调用者提供的,那么传递函数引用就没有意义了,对吗?
让我们考虑一下这段代码:
func add(a: Int, b: Int) -> Int { return a + b }
func someFunc(_ param: (Int, Int) -> Int) {
// some code
}
使用someFunc
拨打add(a: 1, b: 2)
在这里毫无意义,因为您可以改为编写3
。但是,如果您通过add
,someFunc
可以使用其想要的任何参数调用add
。
答案 1 :(得分:1)
从方法定义中可以清楚地看出:
for item in list{
if condition(**item**){
return true
}
}
您正在将列表数组中的元素(Int)发送到条件方法。