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

时间:2015-09-05 02:53:20

标签: swift introspection

我通常会在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中是否可以进行这种内省。有没有办法实现这个目标?

1 个答案:

答案 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 {
}