gpt4 book ai didi

swift - 类方法协议(protocol)

转载 作者:IT王子 更新时间:2023-10-29 05:40:49 25 4
gpt4 key购买 nike

我想在一个协议(protocol)中声明一个class func,我打算从A类、B类和C类中遵守这个协议(protocol)。

B和C继承自A。

本质上,我想在 B 和 C 中覆盖这个函数,同时仍然在 A 中提供一个实现。

所以,我必须声明我的协议(protocol)如下:

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

我该如何解决这个问题?我不能在协议(protocol)中使用 class func...我不确定如何对此进行抽象。

谢谢!

最佳答案

定义中,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的扩展方法(所有核心数据的父类(super class)对象类)如 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

关于swift - 类方法协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31113488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com