我有这个协议,类和一个类,它采用必须符合两者的泛型。
我想构建一个包含此类类数组的注册表,但是如何在注册表中定义一个满足编译器的变量?
考虑这个例子:
protocol SomeProtocol {
}
class SomeClass {
}
class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {
}
class Registry {
private init() {}
// This is not allowed since the second generic doesn't conform to neither required class
var registry:[AnotherClass<AnyObject, AnyObject>] = []
}
答案 0 :(得分:0)
这就是
import UIKit
protocol SomeProtocol {
}
class SomeClass {
}
class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {
}
class TheClass : SomeClass, SomeProtocol {}
class Registry {
private init() {}
var registry:[AnotherClass<AnyObject, TheClass>] = []
}
您需要定义一个继承SomeClass
和SomeProtocol
的类。 AnyObject
不会继承SomeClass
和SomeProtocol
,这就是您收到错误的原因。
<强>更新强> 为了减少其重复性
这就是
import UIKit
protocol SomeProtocol {
}
class SomeClass {
}
class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {
}
class TheClass : SomeClass, SomeProtocol {}
class Registry<T, where T:SomeProtocol, T:SomeClass> {
private init() {}
var registry:[AnotherClass<AnyObject, T>] = []
}
更新2
但是,最终,你最终会得到像
这样的东西Registry<TheClass>
因为泛型最终需要一个具体的类。
您可以做的是在运行时强制执行该类型 - 您需要通过@objc
向协议添加is
。另一种方法是废弃泛型并使用接口或基类。