我可以将Swift与C++混合使用吗?像Objective - C .mm文件一样

EhT*_*hTd 128 c++ objective-c swift

我刚刚将.m文件更改为.mm并使用C++.有没有办法用Swift做同样的事情?

Swi*_*ect 161

这种混淆可能来自这样的假设,即只需.m要将文件扩展名从中更改.mm为桥接语言所需的全部内容,而实际上它并不是那种类型.它不会.mm引起摩擦.cpp,它是.h必须不是C++标题的标题.


同一个项目:是的.

同一个项目中,您可以愉快地混合使用C,C++,Objective-C,Objective C++,Swift甚至Assembly.

  1. ...Bridging-Header.h:使用此桥将C,Objective-CObjective-C++公开给Swift
  2. <ProductModuleName>-Swift.h:暴露自动斯威夫特标有类@objcObjective-C的
  3. .h:这是一个棘手的部分,因为它们被模糊地用于所有C,++或不同的目标,不管目标与否.当a .h不包含单个C++关键字时,class可以将其添加到...Bridging-Header.h,并将公开其声明的相应.c .cpp功能的任何函数.否则,该标头必须包装在纯CObjective-C API中.

同一档案:不.

同一个文件中,你不能混合所有5.在同一个源文件中:

  1. .swift:你不能把Swift和任何东西混在一起
  2. .m:你可以将Objective-CC混合使用.(@Vinzzz)
  3. .mm:您可以将Objective-CC++混合使用.这个桥是Objective-C++.(@Vinzzz).
  4. .c:纯C
  5. .cpp:你可以混合C++汇编(@Vality)
  6. .h:无处不在,含糊不清的C,C++,Objective-CObjective-C++,所以答案取决于它.

参考

  • 万一有人发现这个详细的答案在尝试将 Swift 文件公开到他们的 Objective-C/C++ 文件中时并没有多大帮助(Xcode 抱怨找不到 Swift 头文件)。我发现我必须在 Objective-C/C++ 源文件中**导入“ProductName/ProductModuleName-Swift.h”**。我发现这有点埋在:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html (2认同)

Rob*_*ier 110

不.当你从.m切换到.mm时,你实际上是从Objective-C切换到另一种叫做Objective-C++的语言(有很多细微差别).所以你并没有真正使用C++; 您正在使用Objective-C++,它接受大多数C++作为输入(与C++接受大多数但不是所有C作为输入的方式相同).当我说它不是C++时,考虑一个包含一个名为nil(这是合法的C++)的变量的C++文件,然后尝试将其编译为Objective-C++.

斯威夫特没有相同的关系.它不是C或C++的超集,也不能直接在.swift文件中使用.

"将Swift与Cocoa和Objective-C一起使用"也告诉我们:

您无法直接将C++代码导入Swift.相反,为C++代码创建一个Objective-C或C包装器.

  • 实际上非常烦人 - 我们所有人都使用Cocoa C++代码库的Cocoa应用程序现在必须维护用**3**语言编写的项目.... (92认同)
  • 我建议Objective-c ++不是一个不同的语言,但c ++和Objective-c的混合区别是微妙的,但它仍然存在 (6认同)
  • @rewolf,我认为他的意思是一个名为`nil`的变量,比如`int nil` (6认同)
  • 但是使用ObjC,您可以将`.mm`文件移到(几乎)完成.Swift不是这样. (3认同)

小智 72

我写了一个简单的Xcode 6项目,展示了如何混合使用C++,Objective C和Swift代码:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

特别是该示例从Swift调用Objective C和C++函数.

关键是创建一个共享头Project-Bridging-Header.h并将Objective C头放在那里.

请下载该项目作为完整示例.


fou*_*dry 27

我刚刚使用Swift,Objective-C和C++制作了一个示例项目.这是一个如何在iOS中使用OpenCV拼接的演示.OpenCV API是C++,所以我们不能直接从Swift中与它交谈.我使用一个小包装类,它的实现文件是Objective-C++.该文件是干净的Objective-C,所以雨燕进行直接通话这一点.您必须注意不要将任何C++ - ish文件间接导入Swift与之交互的标头中.

该项目在这里:https://github.com/foundry/OpenCVSwiftStitch


Dan*_*n G 26

您还可以跳过其间的Objective-C文件.只需添加一个带有.cpp源文件的C头文件.头文件中只有C声明,并在源文件中包含任何C++代码.然后在** - Bridging-Header.h中包含C头文件.

下面的示例返回一个指向C++对象(struct Foo)的指针,因此Swift可以存储在COpaquePointer中,而不是在全局空间中定义struct Foo.

Foo.h文件(由Swift看到 - 包含在桥接文件中)

#ifndef FOO_H
#define FOO_H

// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that 
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);

#endif
Run Code Online (Sandbox Code Playgroud)

内部源文件Foo.cpp(Swift看不到):

extern "C"
{
#include "Foo.h"
}
#include <vector>

using namespace std;

// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
   vector<int> data;
};

struct Foo* foo_create()
{
   return new Foo;
}

void foo_destroy(struct Foo* foo)
{
    delete foo;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案值得*方式*更多的赞成。真的很有用。 (2认同)

小智 13

这是我尝试使用clang工具自动化C++/swift通信.您可以从swift实例化C++类,从C++类继承,甚至可以在swift中覆盖虚方法.
它将解析您要导出到swift的C++类并自动生成Objective-C/Objective-C++桥.

https://github.com/sandym/swiftpp


Aus*_*tin 8

Swift与C++不直接兼容.您可以通过使用Objective-C包装C++代码并使用Swift中的Objective C包装器来解决此问题.