Swift 泛型引用类型
Swift generic reference type
我在尝试将泛型类型要求限制为仅引用类型时遇到问题。下面是一些示例代码:
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 足以对该协议进行弱引用,泛型中没有等效项吗?
简单的答案是您不能拥有作为协议的通用类型。
写出语法可以清楚地说明它是如何工作的:
class/struct GenericType<TypeName: TypeConstraints> {}
let thing = GenericType<Type>() where Type is a class or struct that adheres to any constraints
要求采用类型为 class 的协议意味着任何采用者都是 class,但协议 本身 仍然不是类型。
泛型有可能在某些时候支持协议,但这需要将通用方法更改为协议或泛型。尽管您的具体示例可能会在幕后进行少量工作,但有可能在某个时候实施。
如果你想知道他们的发展方向,你可以看看The Generics Manifesto。略读了一下,我没有发现任何与您的用例直接相关的内容,但它非常具体,因此可能不会包含在文档的参数中。
适用于我的特定情况的另一个解决方案如下:
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)
访问元素时,我只需要向下转换回我的协议即可。当然,将此 class 与值类型一起使用时我会失去编译时安全性,但在我的情况下这不是问题。
我在尝试将泛型类型要求限制为仅引用类型时遇到问题。下面是一些示例代码:
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 足以对该协议进行弱引用,泛型中没有等效项吗?
简单的答案是您不能拥有作为协议的通用类型。
写出语法可以清楚地说明它是如何工作的:
class/struct GenericType<TypeName: TypeConstraints> {}
let thing = GenericType<Type>() where Type is a class or struct that adheres to any constraints
要求采用类型为 class 的协议意味着任何采用者都是 class,但协议 本身 仍然不是类型。
泛型有可能在某些时候支持协议,但这需要将通用方法更改为协议或泛型。尽管您的具体示例可能会在幕后进行少量工作,但有可能在某个时候实施。
如果你想知道他们的发展方向,你可以看看The Generics Manifesto。略读了一下,我没有发现任何与您的用例直接相关的内容,但它非常具体,因此可能不会包含在文档的参数中。
适用于我的特定情况的另一个解决方案如下:
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)
访问元素时,我只需要向下转换回我的协议即可。当然,将此 class 与值类型一起使用时我会失去编译时安全性,但在我的情况下这不是问题。