作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个协议(protocol)、类和一个采用必须符合两者的泛型的类。
我想构建一个包含此类类数组的注册表,但如何在注册表中定义满足编译器要求的变量?
考虑这个例子:
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>] = []
}
最佳答案
是这样的
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
添加到您的协议(protocol)中 - 通过 is
。另一种方法是废弃泛型并使用接口(interface)或基类。
关于swift - 如何在 Swift 中拥有具有泛型类型和多重继承的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141778/
我是一名优秀的程序员,十分优秀!