Swift中如何在类方法中动态获取类名(替代self.classForCoder)
动态在类方法中获取类名的方案
嘿,刚好碰到过类似的需求!其实在类方法里完全不需要硬编码,用现有语法就能轻松动态获取类名,分两种常用语言给你说明:
Objective-C 实现
在Objective-C的类方法中,self指向的就是当前类的Class对象,所以直接通过NSStringFromClass(self)就能拿到类名。如果你的场景和编码/归档相关(就像你之前用self.classForCoder的场景),类方法层面也有对应的+classForCoder方法可以调用:
@interface MyClass : NSObject + (void)printDynamicClassName; @end @implementation MyClass + (void)printDynamicClassName { // 直接获取当前类名 NSString *normalClassName = NSStringFromClass(self); NSLog(@"当前类名:%@", normalClassName); // 如果需要编码相关的类(比如归档时的映射类),用类方法版的classForCoder Class codingClass = [self classForCoder]; NSString *codingClassName = NSStringFromClass(codingClass); NSLog(@"编码用类名:%@", codingClassName); } @end
调用[MyClass printDynamicClassName]就会打印出MyClass,如果子类继承这个方法,也会自动打印子类的类名,完全不用修改代码。
Swift 实现
Swift里类方法中可以用Self.self来指代当前类,配合String(describing:)或者NSStringFromClass获取类名;同样也支持classForCoder的类方法版本:
class MyClass: NSObject { class func printDynamicClassName() { // 直接获取类名 let normalClassName = String(describing: Self.self) print("当前类名:\(normalClassName)") // 编码相关的类名 let codingClass = Self.classForCoder() let codingClassName = NSStringFromClass(codingClass) print("编码用类名:\(codingClassName)") } } // 子类继承后也能自动适配 class MySubClass: MyClass {} MySubClass.printDynamicClassName() // 会打印MySubClass
核心逻辑总结
不管是Objective-C还是Swift,类方法中的self(OC)/Self.self(Swift)本身就代表当前类的元类对象,直接转换就能得到动态类名,完全不需要硬编码。如果是和归档编码相关的场景,类方法层面也提供了对应的classForCoder方法,用法和实例方法一致,只是调用对象变成了类本身。
内容的提问来源于stack exchange,提问作者srus2017
相关产品推荐
相关产品推荐

