gpt4 book ai didi

swift - Apple 的函数类型教程

转载 作者:行者123 更新时间:2023-11-28 09:56:18 24 4
gpt4 key购买 nike

所以,我遵循了这个 tutorial来自 Apple。

但它不允许我像教程中那样声明一个 var mathFunction。

func addTwoInts(a: Int, _ b: Int) -> Int
{
return a + b
}

func multiplyTwoInts(a: Int, _ b: Int) -> Int
{
return a * b
}

typealias MathFunctionType = (Int, Int) -> Int

当我开始输入 add... 或 mult... 时,它需要一个 ViewController 的输入参数。 (见图 1,2)

var mathFunction: (Int, Int) -> Int = addTwoInts(ViewController)

var mathFunction2: MathFunctionType = multiplyTwoInts(ViewController)

这两行会产生一个错误(见图3)

var mathFunction: (Int, Int) -> Int = addTwoInts
var mathFunction2: MathFunctionType = multiplyTwoInts

Image 1 Image 2 Image 3

最佳答案

该教程假定您定义的函数是自由函数(又名顶级函数);也就是说,不是类或其他类型中的方法。

因此,如果您在类之外有以下代码(作为顶级代码,或在 playground 中),它会正常工作:

func addTwoInts(a: Int, _ b: Int) -> Int { /*...*/ }
var mathFunction: (Int, Int) -> Int = addTwoInts

如果涉及到类,则有两个问题:

  1. 您的方法(函数)是该类的成员,需要这样引用
  2. 有两种有效的方式来引用您的方法:

    • 一个是柯里化(Currying)函数(一个返回另一个函数的函数):如果你的类被称为Foo,全局名称addTwoInts是一个类型为的函数(Foo) -> (Int, Int) -> Int。也就是说,它是一个接受 Foo 实例并返回类型为 (Int, Int) -> Int 的函数的函数。
    • 作为 Foo 实例成员的名称 addTwoInts 的类型为 (Int, Int) -> Int

换句话说,如果所有都在一个类中,您的代码也能正常工作:

class Foo {
func addTwoInts(a: Int, _ b: Int) -> Int { /*...*/ }
func foo() {
var mathFunction: (Int, Int) -> Int = addTwoInts
//...
}
}

这里,foo() 函数中的 addTwoInts 引用隐式引用了 self.addTwoInts(具有匹配类型),而不是全局 addTwoInts(这是一个柯里化(Currying)函数)。

但是,如果您将函数定义为某个类型的成员,并从其他地方引用它们,则需要将它们显式引用为成员,或者将该类型的实例传递给柯里化(Currying)函数以获取您想要的函数。

class Foo {
func addTwoInts(a: Int, _ b: Int) -> Int { /*...*/ }
}
let bar = Foo()

// the following lines each do the same thing:
let addA: MathFunctionType = bar.addTwoInts
let addB: MathFunctionType = addTwoInts(bar)

如果您的变量 mathFunctionmathFunction2 是同一类的属性,那么您处于相同的情况 — 这些属性的初始化表达式在您的实例之前运行类存在,因此他们无法引用该实例。不过,您可以在没有值的情况下定义它们并用值初始化它们:

class Foo {
func addTwoInts(a: Int, _ b: Int) -> Int { /*...*/ }

var mathFunction: (Int, Int) -> Int

init() {
super.init()
// super.init() is not needed in this example,
// but if you have it, the below must come after it, not before
mathFunction = addTwoInts // implicitly self.addTwoInts
}
}

关于swift - Apple 的函数类型教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com