gpt4 book ai didi

objective-c - 按名称在 Objective-C 中创建一个 Swift 类

转载 作者:行者123 更新时间:2023-11-30 11:17:30 25 4
gpt4 key购买 nike

我正在解决一个问题,我有一个混合代码库和创建范例,其中单个类(在 Objective-C 中)具有我可以创建和使用的所有类的名称。

以前的代码库完全是 Objective-C,所以当我有了需要创建的类的名称时,我只需:

- (Class)sourceClass {
return NSClassFromString(sourceClassName);
}

现在我必须支持返回 Swift 类。我尝试在类前面使用带有点的包名称。这不起作用(返回零):

NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *classStringName = [NSString stringWithFormat:@"%@.%@", appName, sourceClassName];
return NSClassFromString(classStringName);

我还尝试了一些网上找到的疯狂格式化,也返回了nil:

NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *classStringName = [NSString stringWithFormat:@"_TtC%lu%@%lu%@", appName.length, appName, sourceClassName.length, sourceClassName];
return NSClassFromString(classStringName);

最佳答案

尝试使用像这样的运行时来混合和匹配 Objective-C 和 Swift 将是非常有问题的。首先,您需要的所有 Swift 类以及任何属性或函数都必须暴露给 Objective-C。接下来,正如您发现的那样,存在命名问题。检查名称的最佳方法是对项目中的所有类进行快速类转储。以下是我的一个项目中的一些代码,用于扫描包中的类:

 // Get a reference to your main bundle or the bundle where the Swift classes are.
CFBundle * bundle = //....
NSURL *executableURL = (NSURL *) CFBridgingRelease(CFBundleCopyExecutableURL(bundle));
if (executableURL) {

STLog(self, @"Scanning executable: %@", executableURL);

unsigned int count = 0;
const char** classes = objc_copyClassNamesForImage(executable, &count);
STLog(self, @"Found %i classes", count);
if (count == 0) {
return;
}

for(unsigned int i = 0;i < count;i++) {
Class nextClass = objc_getClass(classes[i]);
// Print the class name here
}
}

使用类似的东西应该可以帮助您确保您可以看到您正在查找的类(class)并获得正确的名称。

最后,我对代码描述的担忧是使用单个类作为其他所有内容的工厂的概念。这听起来像是一个极其有限且有问题的设计。我建议您花点时间坐下来重新评估这是否真的是个好主意。

关于objective-c - 按名称在 Objective-C 中创建一个 Swift 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com