【问题标题】:Swift, a function defined in super class that returns the class name of subclass when called from a subclass objectSwift,超类中定义的函数,当从子类对象调用时返回子类的类名
【发布时间】:2016-05-02 17:15:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: swift core-data


【解决方案1】:

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

toString(self)
NSStringFromClass(self)

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

How can I create instances of managed object subclasses in a NSManagedObject Swift extension? 例如,如何从完整中提取核心数据实体名称 类名。

【讨论】:

    【解决方案2】:

    您需要这种简单的方法吗?

    class Base {
    
        class func typeName() -> String {
            return "\(self)"
        }
    
    }
    
    class X: Base {}
    
    print(Base.typeName()) // Base
    print(X.typeName()) // X
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,你是对的,我需要从类型而不是实例中获取名称
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多