gpt4 book ai didi

swift - 类方法的协议(protocol)

转载 作者:行者123 更新时间:2023-11-30 12:46:04 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/41636074/

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