首页 > 解决方案 > 将实例传递给实例方法会引用该实例方法?

问题描述

在Matt Neuburg 的iOS 13 Programming Fundamentals with Swift中,我遇到了这段奇怪的代码

class MyClass {
    var s = ""
    func store(_ s:String) {
        self.s = s
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        let m = MyClass()
        let f = MyClass.store(m) // what just happened!?
        f("howdy")
        print(m.s) // howdy
    }

}

显然 f 具有类型() -> ()(至少在调试器上是这样说的),但在下一行,我们将一个字符串传递给它。

根据结果​​,似乎 f 以某种方式成为了对 store 方法的引用,这就是为什么当m.s打印时你会得到“你好”。但是这段代码真的让我感到困惑,对正在发生的事情的解释将不胜感激。

我什至不明白它MyClass.store是如何合法的,因为store它是一个实例方法,在这种情况下,它被称为静态方法。

标签: iosswiftinstance

解决方案


书中的下一句话告诉你答案:

原因是实例方法实际上是由两个函数组成的柯里化静态/类方法——一个函数接受实例,另一个函数接受实例方法的参数。在该代码之后,f是这些函数中的第二个,并且可以作为将参数传递给实例store方法的一种方式来调用m


推荐阅读