函数类型示例代码 / 需要说明 / Swift

Function Types Example Code / Need Explanation / Swift

提问人:neuraldag 提问时间:9/28/2023 更新时间:9/28/2023 访问量:50

问:

我目前正在学习 Swift 函数类型,这本书给了我这样的代码来演示我们如何在函数中使用变量:

var manipulateInteger: (Int, Int) -> Int

func multNumber(_ first: Int, _ second: Int) -> Int {
    return first * second
}

func addNumber(_ first: Int, _ second: Int) -> Int {
    return first + second
}

manipulateInteger = multNumber 

func doMath(_ manipulateInteger: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("The result is: \(manipulateInteger(a, b))")
}

doMath(addNumbers, 5, 10)

最后一步的注释听起来是这样的:“通过使用第一个参数的 addNumber 调用这个新函数,我们使用新函数对数字求和并输出结果。

我只是想了解我是否做对了:我们更改了 addNumbersmanipulateInteger 只是为了表明我们可以将一个函数参数替换为另一个函数参数,因为它们具有相同的函数类型?还是我错过了什么?

swift 函数 类型 参数 语法

评论


答:

1赞 MOWENIK 9/28/2023 #1

在您的例子中,变量 、 函数 和 以及函数中的参数都是相同类型的实体。manipulateIntegermultNumberaddNumbermanipulateIntegerdoMath(Int,Int) −> Int

您可能对闭包变量 var 和函数中的参数共享相同的名称这一事实感到困惑。实际上,它们并不相关,函数参数可以有任何名称。manipulateIntegermanipulateIntegerdoMath

在函数内部,当引用参数时,您使用的是调用函数时传递给该参数的值。此值可以是与类型 匹配的任何实体。manipulateInteger(Int,Int) −> Int

使用相同的属性名称很容易造成混淆。此示例应有助于阐明:

class Calculator {
    var manipulateInteger: (Int, Int) -> Int

    init(manipulateInteger: @escaping (Int, Int) -> Int) {
        self.manipulateInteger = manipulateInteger
    }

    func doMath(_ manipulateInteger: (Int, Int) -> Int, _ a: Int, _ b: Int) {
        let functionParamResult = manipulateInteger(a, b)
        print("Result from the function parameter manipulateInteger: \(functionParamResult)")

        let classPropertyResult = self.manipulateInteger(a, b)
        print("Result from the class property manipulateInteger: \(classPropertyResult)")
    }
}

func multNumber(_ first: Int, _ second: Int) -> Int {
    return first * second
}

func addNumber(_ first: Int, _ second: Int) -> Int {
    return first + second
}

let calculator = Calculator(manipulateInteger: multNumber)
calculator.doMath(addNumber, 3, 5)

执行此代码将生成以下控制台输出:

Result from the function parameter manipulateInteger: 8
Result from the class property manipulateInteger: 15

因此,从函数体中,您可以访问其参数和对象的属性,即使它们具有相同的名称。

评论

1赞 neuraldag 9/28/2023
确实是的!现在我很清楚了。给你大痉刀!