微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 类方法的协议

我想在协议中声明一个类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 …我不知道如何抽象这个.

谢谢!

类定义中,static是类final的别名,
所以它标记一个无法覆盖的类型方法(或属性)
在子类中.

由于您要覆盖子类中的方法,
您所要做的就是将方法定义为类而不是静态:

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的扩展方法(所有Core Data的超类)
对象类),如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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐