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

Swift中如何按引用传递变量值,实现变量同步更新?

解决Swift中值类型的引用传递需求

嘿,我来帮你搞定这个问题!首先得搞清楚为什么原来的代码达不到你想要的效果:

你的代码里,b = c这一步是把c(也就是当时的a)的值拷贝给了b——因为String是Swift的值类型,默认赋值操作都会创建一个独立的副本。所以后面修改a(通过inout参数修改)的时候,b还是原来的副本值,自然不会跟着变。

要让b和a共享同一个值(实现类似引用传递的效果),有两种常用的方法,我推荐更安全易懂的第一种:

方法1:用Class包装值类型(推荐)

因为Class是Swift的引用类型,多个变量可以指向同一个实例,修改实例的属性时,所有指向它的变量都会看到变化。我们可以把String包装在一个Class里:

// 定义一个包装String的引用类型
class StringHolder {
    var content: String
    init(content: String) {
        self.content = content
    }
}

// 修改你的代码逻辑
var a = StringHolder(content: "*")
var b: StringHolder?

func updateValue(c: inout StringHolder) {
    b = c // 让b和c指向同一个实例(引用传递)
    c.content = "**" // 修改实例的内容
    print("B: \(b!.content)")
    print("C: \(c.content)")
}

updateValue(c: &a)

运行这段代码,输出就是你想要的:

B: **
C: **

方法2:使用不安全指针(不推荐新手)

如果你一定要直接操作内存指针,可以用UnsafeMutablePointer,但这种方式有内存安全风险(比如如果原变量被释放,指针就会变成野指针),所以只在特殊场景下使用:

var a = "*"
var b: UnsafeMutablePointer<String>?

func updateValue(c: inout String) {
    b = &c // 保存指针引用
    c = "**"
    print("B: \(b!.pointee)")
    print("C: \(c)")
}

updateValue(c: &a)

这段代码也能得到你想要的输出,但使用时一定要注意内存生命周期的管理。

总的来说,用Class包装值类型是最符合Swift安全编程理念的解决方案,能轻松实现你要的引用共享效果~

内容的提问来源于stack exchange,提问作者Parth Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:21:35