我通常会在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方法)。
但是,我现在很好奇Swift中是否可以进行这种内省。有没有办法实现这个目标?
答案 0 :(得分:1)
我不明白你为什么不使用NSStringFromClass()
:
class Parent {
class func whoami() -> String {
return NSStringFromClass(self)
}
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}
在Swift 1.2及之前版本中有一个纯粹的Swift等价物String()
(或toString()
):
class Parent {
class func whoami() -> String {
return String(self)
}
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}