我正在遇到问题,试图将通用类型要求限制为仅参考类型。这是一些示例代码:
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)
访问元素时,我只需要对我的协议执行降低。当然,在使用此类类型时,我会失去编译时间安全,但这是我的情况下的一个问题。