NSClassFromString 是 macOS/iOS 系统提供的一个 Objective-C Runtime 函数,作用是:根据类名字符串,动态返回对应的类(Class 类型),可以用来实现“类的反射”。
函数定义
func NSClassFromString(_ className: String) -> AnyClass?
输入:类名字符串,例如 “NSButton” 或 “MyApp.MyCustomView”。
输出:对应的类(AnyClass?),如果找不到该类,返回 nil。
使用示例
if let cls = NSClassFromString("NSButton") as? NSButton.Type {
let button = cls.init(frame: NSRect(x: 0, y: 0, width: 100, height: 40))
print("创建按钮:\(button)")
}
在这里通过NSClassFromString获取NSButton类,并尝试转换为NSButton类型并解包。
如果可以转换为NSButton类型并解包,初始化NSButton并打印输出。
Swift自定义类
对于 Swift 自定义类,需要带上模块名(即项目名)前缀:
let className = "MyApp.MyCustomView" // 注意:必须是模块名 + 类名
if let cls = NSClassFromString(className) as? NSView.Type {
let view = cls.init(frame: .zero)
}
可以使用:
NSStringFromClass(MyCustomView.self)
来获取正确的类名字符串。
使用场景
1、动态创建 UI 控件:用字符串名称动态创建 NSView/UIView。
2、插件架构:加载外部 Bundle 中的类。
3、注册类工厂:类名字符串 → 实际类构造。
4、单元测试中反射类型:避免硬编码类引用。
5、用字符串判断某个类是否存在:NSClassFromString(…) != nil。
总结
NSClassFromString(“类名字符串”) 可以根据类名动态获取类,是 AppKit/Objective-C runtime 中实现“反射”的核心方式。