类方法的协议

时间:2015-06-29 10:34:47

标签: swift

我想在协议中声明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确认:“类方法会覆盖'最终'类方法”。

enter image description here

我该如何解决这个问题?我不能在协议中使用class func ...我不知道如何抽象这个。

谢谢!

1 个答案:

答案 0 :(得分:18)

定义中,staticclass 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