在另一个方法作为参数传递的方法中,为什么传递参数不需要传递参数?

时间:2017-04-11 07:22:00

标签: swift function

我创建了一个传递整数和布尔方法作为参数的方法(此方法需要一个整数作为参数)。当我调用这个方法并传递整数和布尔方法时,代码工作而不需要我在布尔方法中传递整数,为什么会这样?

(以下代码不是我自己的代码,取自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。为什么尽管如此,代码仍然有效?

2 个答案:

答案 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。但是,如果您通过addsomeFunc可以使用其想要的任何参数调用add

答案 1 :(得分:1)

从方法定义中可以清楚地看出:

for item in list{
  if condition(**item**){
   return true
  }
}

您正在将列表数组中的元素(Int)发送到条件方法。