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
是一个实例方法,在这种情况下,它被称为静态方法。
答案 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