将实例传递给实例方法可以引用该实例方法吗?

时间:2020-03-04 20:42:58

标签: ios swift instance

Matt Neuburg撰写的 iOS 13 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是一个实例方法,在这种情况下,它被称为静态方法。

2 个答案:

答案 0 :(得分:3)

书中的下一个词告诉你答案:

原因是实例方法实际上是由两个函数组成的咖喱静态/类方法-一个函数采用一个实例,另一个函数采用该实例方法的参数。在该代码之后,calcs是这些函数的 second ,可以称为将参数传递给实例{{ 1}}。

答案 1 :(得分:2)

Swift中的任何实例方法也可以被静态调用,但是如果这样做,则需要向其传递一个实例以进行操作。因此,例如,您可以选择对数组进行排序,如下所示:

let sortedArray = Array.sort([13, 8, 21, 3, 1, 34, 5, 1, 2])

因此,尽管实例方法定义为store(_ s: String),但编译器还隐式创建了该方法的静态变体,更像是static func store(_ self: MyClass) -> ((String)->())。我不确定调试器为什么会告诉您f是()->()-听起来像Xcode hijinks和shenanigans。

但是,Swift的此属性有一些很酷的用法。参见https://www.swiftbysundell.com/articles/first-class-functions-in-swift

相关问题