目标C,由于循环依赖性导致的Swift互操作性问题

Mid*_* MP 0 objective-c circular-dependency ios swift

我正在开发一个几年前在Objective C中完成的iOS项目.所以我要为现有的一个实现一些新功能,所以这次我正在使用Swift来达到这个目的.

我添加了一个新的Swift类:

class CampView: UIView
{
   // Code
}
Run Code Online (Sandbox Code Playgroud)

我想在我现有的Objective C类中访问这个类.所以我喜欢:

@class CampView;
@interface NewCampViewController : UIViewController

@property (nonatomic, strong) IBOutletCollection(CampView) NSArray *campTypes;

@end
Run Code Online (Sandbox Code Playgroud)

但当我将它连接到我的故事板时,它会崩溃并显示一条消息:

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是密钥值编码兼容的密钥campTypes.

另外我无法将我的系统生成的Swift头文件导入到这个特定的类中,当我这样做时会抛出如下错误:

找不到'MyApp-Swift.h'文件

这就是我@class CampView;在上面的片段中使用的原因.在调查时我发现我的NewCampViewController.h内容包含在Objective C桥接头中.所以怀疑它是由于循环依赖,但我无法解决它.

有人可以帮我解决这个问题吗?

Ric*_*Fox 6

1)您是否import "MyApp-Swift.h"从Objective-C类的.m文件中执行import()?这应避免循环依赖.如果你正在做@class CampView,Xcode希望你将在.m文件中导入CampView类.@class基本上只是头文件的强制转换.

如果您正在获取文件未找到错误,请执行-swift.h导入,请通过查看此帖子来尝试调试.此外,我相信如果您更改项目的名称,导入名称可能不会随之更改.检查模块的名称.

如果您仍然认为有可能从循环导入中找不到此文件的问题,那么验证这种情况的最简单方法是将导入添加到您知道不会有循环调用的另一个obj-c文件,并初始化CampView的测试实例.

2)如果问题是@ Paulw11建议的,IB中的连接,您可以通过检查检查代码中连接的属性旁边的圆点来检查是否建立了连接.单击它应该显示它连接到的内容.未连接空点. 在此输入图像描述 有关如何在代码中正确建立从IB到属性的连接的详细信息,请参阅此链接.