引用类型到 AnyObject 类型的泛型约束的协议

Shu*_*ham 6 generics protocols class swift anyobject

我有一个通用结构声明如下:

struct WeakReference<T: AnyObject> {
    weak var value: T?

    init(value: T?) {
        self.value = value
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个协议:

protocol SomeProtocol: class {

}
Run Code Online (Sandbox Code Playgroud)

但我无法声明 类型的变量WeakReference<SomeProtocol>,编译器抱怨说

“WeakReference”要求是SomeProtocol类类型

有趣的是,在 Swift 中,class是 AnyObject 的类型别名。

我实际上想保存一个数组,WeakReference<SomeProtocol>因为该数组保存强引用。

Swift 中的仅类泛型约束是一个类似的问题,但并没有真正解决这个问题。

我们如何传递SomeProtocolto WeakReference

编辑: 以下场景编译良好,但我们失去了保存弱引用的能力:

struct Reference<T> {
    var value: T?

    init(value: T?) {
        self.value = value
    }
}

var array: [Reference<SomeProtocol>] = []
Run Code Online (Sandbox Code Playgroud)

Zde*_*pič 1

很简单。你正在传递的SomeProtocol是一个protocol. 您需要传递特定的类类型。

示例:

class SomeImplementation: SomeProtocol {
}

var weakSome: WeakReference<SomeImplementation> = ...
Run Code Online (Sandbox Code Playgroud)

或者您可以通过用注释标记协议来绕过它@objc,但我不喜欢这种方法。

@objc protocol SomeProtocol: class {

}

var weakSome: WeakReference<SomeProtocol> = ...
Run Code Online (Sandbox Code Playgroud)

尝试检查这个答案,它可能会为您提供有关该问题的更多背景信息。