ios - 将实例传递给实例方法会引用该实例方法?
问题描述
在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
它是一个实例方法,在这种情况下,它被称为静态方法。
解决方案
书中的下一句话告诉你答案:
原因是实例方法实际上是由两个函数组成的柯里化静态/类方法——一个函数接受实例,另一个函数接受实例方法的参数。在该代码之后,
f
是这些函数中的第二个,并且可以作为将参数传递给实例store
方法的一种方式来调用。m
推荐阅读
- javascript - 如何在 JavaScript 中的两个自定义 html 标签之间获取文本?
- javascript - 这个 JavaScript 代码块有什么作用?
- css - 使用哪个工具来合并 CSS 和 SCSS 代码
- r - blogdown::new_site() 失败:site_root(config) 中的错误
- javascript - 上传前使用javascript重命名文件
- vba - 如何通过 URL 从 Outlook365 下载照片到 powerpoint
- python - 拆分成两列,将txt文本转换成csv文件
- ionic-framework - Ionic Angular 5. 星级评分系统
- c++ - 在类构造函数中初始化联合内的结构成员
- flowtype - 在 Flow 中将广泛的原始类型细化为枚举类型