Swift 4中能否创建包含weak引用的元组?
在Swift 4中创建包含weak引用的元组?
嘿,刚好之前研究过类似的问题——在Swift 4里没法直接写出你示例里那种带weak引用的元组,像let x: (name: weak MyClass, name2: weak MyClass2)这种写法,编译器直接会报错。
原因其实很简单:weak是用来控制引用类型内存管理的修饰符,它只能修饰具体的变量/属性,而不能直接加在元组的元素类型声明里。Swift的元组属于值类型,它的元素类型本身不支持附加weak这类内存管理关键字,元组里的引用类型元素默认都是强引用。
那如果我们需要实现类似“包含弱引用的成对数据”的效果,有两个常用的替代方案:
方案1:用自定义结构体模拟
结构体里可以声明带weak修饰的可选类属性(注意weak引用必须是可选类型,因为对象可能被释放):
struct WeakPair { weak var name: MyClass? weak var name2: MyClass2? } // 使用示例 let myClassInstance = MyClass() let myClass2Instance = MyClass2() let x = WeakPair(name: myClassInstance, name2: myClass2Instance)
方案2:用自定义类封装
如果需要引用语义(比如多个地方共享这个“弱引用对”的状态),可以用类来实现:
class WeakPairHolder { weak var name: MyClass? weak var name2: MyClass2? init(name: MyClass?, name2: MyClass2?) { self.name = name self.name2 = name2 } } // 使用示例 let x = WeakPairHolder(name: myClassInstance, name2: myClass2Instance)
这两种方式都能达到你想要的“同时持有两个弱引用”的目的,虽然不像元组那样简洁,但胜在符合Swift的语法规则和内存管理机制。
内容的提问来源于stack exchange,提问作者Kamil Harasimowicz
相关产品推荐
相关产品推荐

