我有一组异构对象类型(常见的超类)。每个元素,我想获取一个类类型来实例化。在ObjectiveC中,我做了类似的事情:
@implementation CommonClass
- (Class) secondaryAnnotationClass {
return [MKAnnotationView class]; // abstract implementation, just return default class
}
@end
@implementation SubclassFoo
- (Class) secondaryAnnotationClass {
return [FooAnnotationView class]; // my specific annotation class
}
@end
@implementation SubclassBar
- (Class) secondaryAnnotationClass {
return [BarAnnotationView class]; // my specific annotation class
}
@end
那么我该如何在Swift中重新创建呢?我认为它类似于以下内容,但我还没有做正确的事情让编译器将简单的红点带走。
class CommonClass {
var secondaryAnnotationClass:Type {
return MKAnnotationView.self // abstract implementation, just return default class
}
}
class SubclassFoo:CommonClass {
var secondaryAnnotationClass:Type {
return FooAnnotationView.self // my specific annotation class
}
}
class SubclassBar:CommonClass {
var secondaryAnnotationClass:Type {
return BarAnnotationView.self // my specific annotation class
}
}
似乎为了让Swift的类型系统保持高兴,我真正需要说的是,我不仅会返回一个Type(它真的是Class的替代品吗?),但它会是MKAnnotationView
或其子类之一。
答案 0 :(得分:1)
您可以secondaryAnnotationClass
返回MKAnnotationView.Type
:
class CommonClass {
var secondaryAnnotationClass: MKAnnotationView.Type {
return MKAnnotationView.self
}
}
class SubclassFoo:CommonClass {
override var secondaryAnnotationClass: MKAnnotationView.Type {
return FooAnnotationView.self
}
}
class SubclassBar:CommonClass {
override var secondaryAnnotationClass: MKAnnotationView.Type {
return BarAnnotationView.self
}
}
使用此方法,如果您需要使用特定于FooAnnotationView
或BarAnnotationView
的方法或属性,则必须进行向下转换。例如:
class FooAnnotationView: MKAnnotationView {
func myFunc() {
print("Foo")
}
}
let subclassFoo = SubclassFoo()
let annotation = subclassFoo.secondaryAnnotationClass() as! FooAnnotationView
annotation.myFunc() // Prints: "Foo"