【发布时间】:2015-12-01 06:15:37
【问题描述】:
我通常将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 中是否完全可行。有没有办法做到这一点?
【问题讨论】:
-
在面向对象编程中,任何时候你认为你需要知道一个类的name,你可能应该再想一想。整个概念是一种“难闻的气味”。
-
@matt 绝对同意,但是CoreData需要知道实体的名称(作为字符串)才能将其插入数据库,所以这有点特殊。
标签: swift introspection