我需要在我的通用基类中传递一个类型。
class SomeBaseClass<T: AnyClass> {
// Implementation Goes here
}
我收到以下错误:
继承自非协议,非类型&#39; AnyClass&#39; (又名 &#39; AnyObject.Type&#39)
理想情况下,我想使用&#39; T&#39;作为特定类型而不是AnyClass,但AnyClass也可以。
由于
答案 0 :(得分:4)
您可以改为执行以下操作:
,而不是指定T
需要成为一个类
class SomeBaseClass<T> {
let type: T.Type
init(type: T.Type) {
self.type = type
}
}
如果您计划大量使用T.Type
,可能值得使用typealias
:
class SomeBaseClass<T> {
typealias Type = T.Type
let type: Type
...
}
一些示例用法:
let base = SomeBaseClass(type: String.self)
此方法的优点是T.Type
可以表示结构和枚举,以及类。
答案 1 :(得分:4)
如果您希望类型为类,则应使用AnyObject
。
class SomeBaseClass<T: AnyObject> {
// Implementation Goes here
}
// Legal because UIViewController is a class
let o1 = SomeBaseClass<UIViewController>()
// Illegal (won't compile) because String is a struct
let o2 = SomeBaseClass<String>()
答案 2 :(得分:1)
你可以做到这一点:
protocol P {}
class C: P {}
class C1<T: P> {}
let c1 = C1<C>()
在这种情况下,您使用协议C
将类P
打包,然后您就可以创建新的通用类C1
,其中T
是您的协议P
。这允许您使用泛型参数类C1
创建C
类的实例。