我想在协议中声明class func
,我打算从A,B和C类符合这个协议。
B和C继承自A.
基本上我想在B和C中覆盖此func,同时仍在A中提供实现。
所以,我必须按如下方式声明我的协议:
protocol MyManagedObjectCoolStuff {
static func entityName() -> String
}
然后我在A:
中有这个class A: NSManagedObject { }
class B: A { }
class C: A { }
extension A: MyManagedObjectCoolStuff {
static func entityName() -> String {
return "Animal"
}
}
extension B: MyManagedObjectCoolStuff {
override static func entityName() -> String {
return "Bat"
}
}
extension C: MyManagedObjectCoolStuff {
override static func entityName() -> String {
return "Cat"
}
}
这里的问题很清楚,Xcode确认:“类方法会覆盖'最终'类方法”。
我该如何解决这个问题?我不能在协议中使用class func
...我不知道如何抽象这个。
谢谢!
答案 0 :(得分:18)
在类定义中,static
是class final
的别名,
所以它标记了一个无法覆盖的类型方法(或属性)
在子类中。
由于希望覆盖子类中的方法,
您所要做的就是将方法定义为class
而不是static
:
extension A: MyManagedObjectCoolStuff {
class func entityName() -> String {
return "Animal"
}
}
extension B: MyManagedObjectCoolStuff {
override class func entityName() -> String {
return "Bat"
}
}
extension C: MyManagedObjectCoolStuff {
override class func entityName() -> String {
return "Cat"
}
}
或者可以使用以下事实:对于核心数据实体,
类名通常定义为<ModuleName>.<EntityName>
这样实体名称就是类名的最后一个组成部分。
因此,您可以将entityName()
定义为
NSManagedObject
的扩展方法(所有核心数据的超类)
对象类),如How can I create instances of managed object subclasses in a NSManagedObject Swift extension?:
extension NSManagedObject {
class func entityName() -> String {
let classString = NSStringFromClass(self)
// The entity is the last component of dot-separated class name:
let components = split(classString) { $0 == "." }
return components.last ?? classString
}
}
并仅在必要时覆盖它:
class A: NSManagedObject { }
class B: A { }
class C: A { }
extension C {
override class func entityName() -> String {
return "Cat"
}
}
println(A.entityName()) // A
println(B.entityName()) // B
println(C.entityName()) // Cat