Swift类内通过指定实例而非self调用成员方法的疑问
问题解析:Swift类中直接调用外部实例方法的逻辑
先看你的代码:
class ImAClass { init() {} func wannaPrint(_ str: String) { print(str) } func unknow() { instanceOne.wannaPrint("hi") } } let instanceOne = ImAClass() instanceOne.unknow() //hi let instanceTwo = ImAClass() instanceTwo.unknow() //hi
核心原因:变量作用域与实例的独立性
instanceOne是全局作用域的实例(定义在类ImAClass的外部),并非类的成员变量。Swift中,类内部的方法可以直接访问全局作用域的变量,所以unknow()方法里能直接拿到instanceOne。- 你调用的是
instanceOne这个特定实例的wannaPrint方法,不是当前实例(self)的方法。不管是instanceOne.unknow()还是instanceTwo.unknow(),执行unknow()时都是去找全局的instanceOne,让它执行打印逻辑,所以两次输出都是hi。
对比self的用法
如果要让每个实例调用unknow()时,执行自己的wannaPrint,应该改成:
func unknow() { self.wannaPrint("hi") }
这时候instanceOne.unknow()和instanceTwo.unknow()本质是各自调用自身的方法,虽然结果都是hi,但执行主体是当前实例,和之前的逻辑完全不同。
总结
这种写法并非Swift独有,只要编程语言支持全局变量访问,都能实现类似逻辑——本质是在类方法里操作一个外部的全局实例,和类自身的实例成员访问是两回事。
内容的提问来源于stack exchange,提问作者MrYellow
相关产品推荐
相关产品推荐

