Swift 你能得到调用超级方法的子类的名称吗?

Swift 你能得到调用超级方法的子类的名称吗?,swift,introspection,Swift,Introspection,我通常会将create…:inContext:方法添加到我的NSManagedObject子类中,该子类插入并初始化对象。例如: class Example : NSManagedObject { class func createWithArgument(arg: Int, inContext context: NSManagedObjectContext) -> Example { let example = NSEntityDescription.insert

我通常会将
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方法)


然而,我现在很好奇这种反省在斯威夫特是否可能。有没有办法做到这一点?

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

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


在面向对象编程中,每当您认为需要知道类的名称时,您都应该三思而后行。整个概念都是一种“异味”。@matt完全同意,但是CoreData需要知道实体的名称(作为字符串)才能将其插入数据库,所以这是一种特殊情况。谢谢,这很有效。知道为什么
NSStringFromClass
可以在
\u stdlib\u getDemangledTypeName
不能工作的地方工作吗?
class Parent {
    class func whoami() -> String {
        return NSStringFromClass(self)
    }
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}
class Parent {
    class func whoami() -> String {
        return String(self)
    }
}
class FirstChild : Parent {
}
class SecondChild : Parent {
}