Swift项目和oc混编-命名空间问题

本文分享了在一个Swift项目中混编Objective-C代码时遇到的问题及解决方案,特别是针对使用第三方IM服务时出现的类加载失败的情况,介绍了如何通过指定命名空间来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文结合本人项目遭遇所得

新项目是swift写的,新东西用了真的戒不掉,只是和oc混编最为致命。。。

举个栗子

我们项目中因为用到了第三方的IM服务(市面上基本上所有第三方IM服务提供的库和代码也都是oc的),坑就这么来了,以下是情景:

NSString *contentStr = [layoutConfig cellContent:self.model]; // 获得类名字符串
Class clazz = NSClassFromString(contentStr); // 字符串转Class
NIMSessionMessageContentView *contentView =  [[clazz alloc] initSessionMessageContentView];
NSAssert(contentView, @"can not init content view");
复制代码

解读一下,这段IM-UI库代码的作用是用model中的字符串创建contentView的类。

例如:IM-UI库中中的OC类NIMSessionLocationContentView.h,则 contentStr = @"NIMSessionLocationContentView"然后得到对应的clazz为NIMSessionLocationContentView.

因为是Swift项目,以及自定义contentView类,所以便有了我们项目的Swift文件的ContentView -> CDNetCallTipContentView。那么问题来了,contentStr = @"CDNetCallTipContentView"没毛病,但是clazz却为nil

后面查到,这种混编情况要指明命名空间!命名空间为自己项目的Target名。例如Target是CDApp。则OC文件中正确获得CDNetCallTipContentView的方式是`contentStr = @"CDApp.CDNetCallTipContentView"。

但是问题还没有完全解决!

很多朋友因为需要,项目存在多个Target(区分开发版本或者环境等原因)。例如原Target是CDApp,开发环境的CDApp Dev。开发环境的Target名中间有空格,这时候如果contentStr = @"CDApp Dev.CDNetCallTipContentView",最后clazz却是nil。问题就出在空格上,要把空格替换成单下划线_contentStr = @"CDApp_Dev.CDNetCallTipContentView"

以下是修改后的代码:

NSString *contentStr = [layoutConfig cellContent:self.model];
Class clazz = NSClassFromString(contentStr);
if (!clazz){
    NSString * nameSpace = [NSBundle mainBundle].infoDictionary[@"CFBundleName"];
    contentStr = [[NSString stringWithFormat:@"%@.%@",nameSpace,contentStr] stringByReplacingOccurrencesOfString:@" " withString:@"_"]; // 空格要换成下划线
    clazz = NSClassFromString(contentStr);
}
NIMSessionMessageContentView *contentView =  [[clazz alloc] initSessionMessageContentView];
NSAssert(contentView, @"can not init content view");
复制代码

转载于:https://juejin.im/post/5a5862e46fb9a01c9950beaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值