Swift,一个在超类中定义的函数,它从子类对象调用时返回子类的类名

时间:2015-04-10 15:44:33

标签: swift core-data

在Objective-C中,我可以这样做:

@interface MyManagedObjectSuperClass : NSManagedObject 
+(NSString*)entityName;
@end

@implementation
+(NSString*)entityName
{
    return NSStringFromClass([self class])
}
@end

使用这个基类,我的所有其他NSManagedObjects都可以从MyManagedObjectSuperClass继承。我可以通过调用+entityName获取实体名称,因为polymorphism,在子类中,NSStringFromClass([self class])返回子类的类名。

所以我的问题是,我可以在Swift中这样做吗?

3 个答案:

答案 0 :(得分:1)

NSObject子类的类方法中,两者都是

toString(self)
NSStringFromClass(self)

返回包含类名的字符串(包括产品模块名称) 调用该方法的实际子类。

参见How can I create instances of managed object subclasses in a NSManagedObject Swift extension? 例如,如何从完整中提取Core Data实体名称 班级名称。

答案 1 :(得分:0)

您可以使用dynamicType获取类名(包括模块名称),并使用字符串插值将其转换为字符串:

class Class1 {
    var entityName: String {
        return "\(self.dynamicType)"
    }
}

最明显的区别是它是一个实例而不是静态属性/方法 - 这可能是你的情况下的一个限制,因为我认为你想要从类型中获取名称,而不是它的实例。

答案 2 :(得分:0)

这是一种直截了当的方法吗?

class Base {

    class func typeName() -> String {
        return "\(self)"
    }

}

class X: Base {}

print(Base.typeName()) // Base
print(X.typeName()) // X