gpt4 book ai didi

swift - 你能得到调用 super 方法的子类的名称吗?

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:11 25 4
gpt4 key购买 nike

我通常将 create...:inContext: 方法添加到我的 NSManagedObject 子类中,该方法插入然后初始化对象。所以,例如:

class Example : NSManagedObject {
class func createWithArgument(arg: Int, inContext context: NSManagedObjectContext) -> Example {
let example = NSEntityDescription.insertNewObjectForEntityForName("Example", inManagedObjectContext: context) as! Example

// ...
}
}

这对于特定的类来说效果很好,但是如果 Example 是一个抽象模型,那么硬编码 "Example" 将不起作用。我想要做的是插入调用 createWithArgument:inContext: 方法的实体的类型,这样我就可以做这样的事情:

class SpecificExample : Example {
class func createInContext(context: NSManagedObjectContext) -> SpecificExample {
return super.createWithArgument(2, inContext: context) // always 2 because reasons
}
}

我最初的计划是只获取调用类型的名称并将其用作实体名称(前提是类名称和实体名称始终匹配)。

不幸的是,这似乎行不通;如您所见,即使您在子类上调用该方法,您也始终获得父类型:

import UIKit

class Parent {
class func getClassName(type: Any? = nil) -> String {
return _stdlib_getDemangledTypeName(type ?? self).componentsSeparatedByString(".").first!
}
}

class FirstChild : Parent {

}

class SecondChild : Parent {
override class func getClassName(type: Any? = nil) -> String {
return super.getClassName(self)
}
}


Parent.getClassName() // Parent
FirstChild.getClassName() // Parent
SecondChild.getClassName() // SecondChild

现在,在我的具体示例中,还有其他方法可以达到相同的结果(例如,在子类中创建对象,然后调用继承的 init 方法)。

但是,我现在很好奇这种自省(introspection)在 Swift 中是否完全可行。有办法实现吗?

最佳答案

我不太明白你为什么不使用 NSStringFromClass():

class Parent {
class func whoami() -> String {
return NSStringFromClass(self)
}
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}

还有一个纯 Swift 等价物,String()(或 Swift 1.2 及之前的 toString()):

class Parent {
class func whoami() -> String {
return String(self)
}
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}

关于swift - 你能得到调用 super 方法的子类的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32409045/

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