SWIFT通用参考类型



我正在遇到问题,试图将通用类型要求限制为仅参考类型。这是一些示例代码:

class WeakHolder<Element: AnyObject> {
    weak var element: Element?
    init(element: Element) {
        self.element = element
    }
}
protocol Animal: class { }
class Dog: Animal { }
let dog: Animal = Dog()
let holder = WeakHolder<Animal>(element: dog) // Error: Using "Animal" as a concrete type conforming to protocol 'AnyObject' is not supported.

如果将通用要求更改为<Element: class>,则会获得错误class constraint can only appear on protocol declarations

这是仿制药的限制吗?将协议标记为类足以对该协议有较弱的参考,在仿制药中没有等效吗?

简单的答案是您不能具有一个协议的通用类型。

写出语法表明这是如何工作的: class/struct GenericType<TypeName: TypeConstraints> {}

let thing = GenericType<Type>() where Type is a class or struct that adheres to any constraints

要求采用类型作为类的协议意味着任何采用者都是类,但是协议本身仍然不是类型。

仿制药在某种程度上可能支持协议,但是它需要将一般方法更改为协议或仿制药。尽管您的特定示例可能在幕后工作较少,因此可能会在某个时候实现。

,如果您想查看它们的方向,可以查看仿制药宣言。浏览它,我找不到与您的用例直接相关的任何内容,但它很具体,因此可能不会包含在文档的参数中。

在我的特殊情况下起作用的另一种解决方案如下:

class WeakHolder<Element: AnyObject> {
    weak var element: Element?
    init(element: Element) {
        self.element = element
    }
}
protocol Animal: class { }
class Dog: Animal { }
let dog: Animal = Dog()
let holder = WeakHolder<AnyObject>(element: dog as AnyObject)

访问元素时,我只需要对我的协议执行降低。当然,在使用此类类型时,我会失去编译时间安全,但这是我的情况下的一个问题。

相关内容

  • 没有找到相关文章

最新更新