【发布时间】:2021-11-26 13:11:01
【问题描述】:
我正在尝试在目标 c 中使用反射加载一个类,并为 swift 类和目标 c 类获得不同的结果
我看到的是,使用 NSClassFromString,对于一个目标 c 类,我只需要提供 类名 作为输入,而对于一个 swift 类,我需要输入 bundle id 作为前缀
我想知道为什么会这样,以及是否有办法在使用相同输入的两个平台上使用一个代码
以下示例
例如
目标c类 - A
swift 类 - B
项目的bundle id是Test
Class test1 = NSClassFromString(@"A"); // works
Class test2 = NSClassFromString(@"Test.A"); // doesn't work
Class test3 = NSClassFromString(@"B"); // doesn't work
Class test4 = NSClassFromString(@"Test.B"); // works
我尝试在 swift 中做同样的事情并遇到同样的问题
var test1 = NSClassFromString("A") as? A.Type // works
var test2 = NSClassFromString("Test.A") as? A.Type // doesn't work
var test3 = NSClassFromString("B") as? B.Type // doesn't work
var test4 = NSClassFromString("Test.B") as? B.Type // works
男人
【问题讨论】:
-
那么使用
A用于ObjC 类和Test.B用于swift 有什么问题? -
我想知道是否有 API 可以让同一个字符串同时适用于目标 c 和 swift 类
-
你已经找到了一个 API,问题是 swift 是按模块组织的,这是 objc 中不存在的概念。但是通过命名约定,可以找到并区分类名是 objc 还是 swift .. 例如前面带有
.和模块名称。不鼓励在其他语言空间中寻找类名,但显然是可能的。因为两者都有其特定的桥接机制到您遇到麻烦的另一种语言。意味着您可以使用@objc(desiredname)显式公开一个 swift 类,并在正确完成桥接后在具有该名称的 objc 中找到它。
标签: ios swift objective-c reflection