You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:12:47