如何在作为协议类型的 Swift 通用数据结构中使用弱引用?

Posted

技术标签:

【中文标题】如何在作为协议类型的 Swift 通用数据结构中使用弱引用?【英文标题】:How can you use weak references in Swift generic data structure typed as a protocol? 【发布时间】:2016-08-31 05:55:42 【问题描述】:

我想在通用数据结构中使用弱引用;在里面 Array 下面的示例,但通常是任何泛型类型。我几乎可以得到它 上班:(

我的实验开始得很顺利;以下作品:

// Array of weak references OK
struct WeakReference<T: AnyObject> 
    weak var value: T?

class C 
    var i: Int = 0

let c = C() // Strong reference to prevent collection
let weakCs = [WeakReference(value: c)] // OK
print("C: \(weakCs[0].value!.i)") // 0

我可以添加一个协议:

// Array of weak references that implements a protocol OK
protocol P: AnyObject  // Note AnyObject
    var i: Int  get 

class CP: P 
    var i: Int = 0

let cP = CP() // Strong reference to prevent collection
let weakCPs = [WeakReference(value: cP)] // OK
print("CP: \(weakCPs[0].value!.i)") // 0

但是当我想要一个对协议的弱引用数组时,我得到一个错误:

// Array of weak references of a protocol not OK
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Using 'P' as
a concrete type conforming to protocol 'AnyObject' is not supported
print("P: \(weakPs[0].value!.i)") // 0

我错过了什么吗?

错误消息,“使用'P'作为符合协议的具体类型 'AnyObject' is not supported",暗示它是一个临时限制 编译器。这会被修复吗?我应该提交错误报告吗?

提前感谢您的任何建议,

-- 霍华德。

【问题讨论】:

【参考方案1】:

玩了一圈发现:

// Array of weak references of a protocol OK so long as protocol marked @objc
@objc protocol P  // Note @objc
    var i: Int  get 

class CP: P 
    var i: Int = 0

let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]`
print("P: \(weakPs[0].value!.i)") // 0

工作:)

您必须使用 @objc 并因此不是纯 Swift 解决方案,这很烦人,但因为我在 ios 上对我来说不是问题。

【讨论】:

以上是关于如何在作为协议类型的 Swift 通用数据结构中使用弱引用?的主要内容,如果未能解决你的问题,请参考以下文章

符合自定义协议的通用函数 - Swift

如何在 R 中使 naiveBayes() 的公式参数通用?

Swift - 具有实现通用协议的值的 Typealias 字典

Swift 5:在使用协议实现 Equatable 的结构上实现通用数组操作

Swift:检查泛型类型是不是符合协议

Swift 中可编码属性的 iOS 通用类型