如何在作为协议类型的 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 通用数据结构中使用弱引用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 中使 naiveBayes() 的公式参数通用?
Swift - 具有实现通用协议的值的 Typealias 字典