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
相关产品推荐
相关产品推荐

