【问题标题】:How can you use weak references in Swift generic data structure typed as a protocol?如何在作为协议类型的 Swift 通用数据结构中使用弱引用?
【发布时间】: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",暗示它是一个临时限制 编译器。这会被修复吗?我应该提交错误报告吗?

提前感谢您的任何建议,

-- 霍华德。

【问题讨论】:

    标签: swift generics weak-references swift-protocols


    【解决方案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 上对我来说不是问题。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多