swift - AnyObject 类型泛型约束的引用类型协议(protocol)

标签 swift class generics protocols anyobject

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

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

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

还有一个协议(protocol):

protocol SomeProtocol: class {

}

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

'WeakReference' requires that SomeProtocol be a class type

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

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

Class-only generic constraints in Swift是一个类似的问题,但并没有真正解决这个问题。

我们怎样才能通过 SomeProtocolWeakReference

编辑: 以下场景编译正常,但我们失去了持有弱引用的能力:

struct Reference<T> {
    var value: T?

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

var array: [Reference<SomeProtocol>] = []

最佳答案

很简单。您正在传递 SomeProtocol,这是一个 protocol。您需要向那里传递特定的类类型。

示例:

class SomeImplementation: SomeProtocol {
}

var weakSome: WeakReference<SomeImplementation> = ...

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

@objc protocol SomeProtocol: class {

}

var weakSome: WeakReference<SomeProtocol> = ...

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

关于swift - AnyObject 类型泛型约束的引用类型协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51706773/

相关文章:

ios - 如何在 iOS 上的 Swift 中保存和恢复图形上下文?

ios - 为什么 SpriteKit 在场景之间来回转换时会崩溃

c++ - 是否可以在不声明其方法的情况下保留裸类定义?

ios - 重用类最佳实践

java - 从另一个Java类调用 "non-void"方法

java - Haskell 中的类型构造函数和 java 泛型类型有什么不同?

ios - 定义可选泛型闭包参数的类型

c# - 使用泛型转换代码

objective-c - 将 Objective C 自定义模型实例存储到 swift 类中以标识实例

ios - 奇怪的核心数据行为(重复条目)