如何将泛型类型限制为类型,而不是类型的实例?
如果我有课:
class SomeClass< T:SomeProtocol> {}
我怎样才能确保T只是AnyClass的一个实例(只是AnyObject.Type)
我的协议只有静态方法,为了调用那些方法我必须做instance.dynamicType.protocolMethod而我想做someType.protocolMethod
最佳答案 AFAIK, Swift不允许您使用元类型作为泛型类型. (我相信这与Sam Giddins wished for in Swift 3的内容一致.)
但是,您可以将其用作值.而不是使T成为类型参数,使其成为属性:
protocol SomeProtocol {
static func foo()
}
struct Concrete: SomeProtocol {
static func foo() {
print("I am concrete")
}
}
class SomeClass {
let T: SomeProtocol.Type
init(T: SomeProtocol.Type) {
self.T = T
}
func go() {
T.foo() // no need for dynamicType
}
}
SomeClass(T: Concrete.self).go()
如果你说,你的协议只包含静态方法,那么这就足够了.但是,如果您需要将通用参数绑定到该类型,那也是可能的:
class SomeClass<U: SomeProtocol> {
let T: U.Type
init(T: U.Type) {
self.T = T
}
func go(value: U) {
T.foo()
}
}
SomeClass(T: Concrete.self).go(Concrete())