我想在通用数据结构中使用弱引用;在里面
下面是数组的示例,但通常是任何泛型类型。我几乎可以得到它
上班 :(
我的实验开始得很顺利。以下作品:
// 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'不受支持”,暗示这是一个临时限制
编译器。这会被修复吗?我应该提交错误报告吗?
预先感谢您的任何建议,
——霍华德。
玩了一下我发现:
// 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
works :)
令人烦恼的是,你必须使用 @objc,因此不是一个纯粹的 Swift 解决方案,但由于我使用的是 iOS,这对我来说不是问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)