无法将 .mm 文件访问到 swift4

Posted

技术标签:

【中文标题】无法将 .mm 文件访问到 swift4【英文标题】:Not able to access .mm file into swift4 【发布时间】:2018-07-24 06:43:33 【问题描述】:

我正在开发一个包含 Objective C、Objective C++ 和 Swift4 类的项目。我正在尝试将 .mm 文件(即 Objective C++ 文件)访问到 swift 类中,但它给了我一个错误并显示它未声明。我在项目中添加了一个桥接头,并在那里导入了 Objective C++ 文件的头。

理解问题的例子:

我有 A.mm 类,其中导入了 B.mm 类。将 A 类添加到桥接头后编译器在 B 类中给出错误。

B.h 中的错误:

请帮忙

【问题讨论】:

签入目标>构建阶段>编译源您的.mm 是否列出,如果没有添加。它会工作 它添加到编译源中。 B类的错误是什么?能否请您添加一些屏幕截图? @aBilal17 已添加,请查看 在struct关键字前加上'typedef'然后检查。 【参考方案1】:

Swift 只能桥接到 C 和 Objective-C。如果您缺少的类在其标头中使用 C++ 类型,则 Swift 将无法读取该文件并跳过该类。

您能否更改您的 Objective-C++ 类,使其仅在其 .mm 文件中使用 C++ 类型,而不在其 .h 文件中使用?然后它看起来就像一个普通的 Swift 的 Objective-C 类,你应该可以使用它。

或者,您可以创建第二个“在外部”是 ObjC 的类,并在其 .mm 中调用 ObjC++ 类,然后只处理所有调用,将 C++ 数据类型转换为简单的 C 类型或ObjC 对象。

查看用于声明 C++ 属性和实例变量的“类扩展”,这些属性和实例变量通常会进入 .mm 文件的标头中。

【讨论】:

我尝试了将所有 CPP 代码移动到 .mm 文件中的第一种方法。它起作用了,所有错误都消失了,但是如何在已移入 .mm 文件的类型的 .h 文件中声明变量。 如果类型是 C++ 类型,则不能。一旦你把它们放在标题中,Swift 将无法读取文件。因此,您需要做的是找到等效的 ObjC 或 C 类型并使用它们,或转换为它们(例如,您可以创建一个包含 C++ 类值的 NSDictionary,然后使方法采用字典,并在内部使用这些方法创建 C++ 类,用字典中的值填充它,并在 C++ 代码填充结构时执行相反的操作。 如果你的意思是你的头文件中有实例变量,这些实例变量只供你的实现文件使用,不需要从 Swift 直接访问,这就是类扩展的用途(@interface MyClass () MyCppObject _foo; @end ),您可以将这样的类扩展放入 .mm 文件的顶部,然后该代码的行为就像在标头中声明它们一样。 感谢您的回复,我尝试了将它们转换为等效目标 C 的方法。我将您的答案标记为正确。感谢您的帮助

以上是关于无法将 .mm 文件访问到 swift4的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 Firestore 后端

无法将JSON数据访问到角度(.ts)文件中

无法将文件 obj\Debug 复制到 bin\Debug 对路径 bin\Debug\ 的访问被拒绝

ms访问;如何将其移入无法访问状态/无DSN表没有密码

无法将文件 reference.dll 复制到 bin/reference.dll。该进程无法访问文件reference.dll,因为它正被另一个进程使用

从 XCode 将文件提交到 Github 的问题:警告:无法访问“/Users/alexandra/.config/git/ignore”:权限被拒绝