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

我只是将.m文件更改为.mm并使用C ++。 有没有办法做到这一点与斯威夫特?

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

Swift不具有相同的关系。 它不是C或C ++的超集,并且不能直接在.swift文件中使用。

“用cocoa和Objective-C使用Swift”也告诉我们:

你不能直接导入C ++代码到Swift中。 相反,为C ++代码创build一个Objective-C或C包装器。

这种混淆可能来自于这样的假设,即仅仅将文件扩展名从.m更改为.mm就是您需要桥接语言的时候,但事实上,这种混淆并不成立。 这不是.mm引起的与.cpp摩擦的.mm ,它是必须肯定不是C++头的.h头。


同一个项目:是的。

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

  1. ...Bridging-Header.h :你使用这个桥向CObjective-CObjective-C ++展示 Swift
  2. <ProductModuleName>-Swift.h :将标有@objc Swift自动公开给Objective-C
  3. .h :这是一个棘手的部分,因为它们被模糊地用于所有types的C++或不是, 目标与否。 当.h不包含单个C ++关键字时,如class ,它可以被添加到...Bridging-Header.h ,并将公开任何函数声明相应的.c .cppfunction。 否则,该头文件必须封装在纯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 ++Assembly ( @Vality )
  6. .h :无处不在和模棱两可的CC ++Objective-CObjective-C ++ ,所以答案就是这个取决于。

参考

  • 从C ++调用程序集 ( Brett Hale )
  • 从Objective-C ( Svitlana ) 调用Swift
  • 从Swift调用C,C ++,Obj-C,Obj-C ++ ( SwiftArchitect ,self)
  • 要下载完整的iOS 9,Xcode 7项目, 请在Swift Recipes中searchSO-32541268 。

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

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

特别是从Swift中调用一个Objective C和一个C ++函数。

关键是创build一个共享头文件Project-Bridging-Header.h,并将Objective C头文件放在那里。

请下载该项目作为一个完整的例子。

我刚刚使用Swift,Objective-C和C ++做了一个小例子项目。 这是一个如何在iOS中使用OpenCV拼接的演示。 OpenCV API是C ++,所以我们不能直接从Swift中直接谈论它。 我使用一个小的包装类,他的实现文件是Objective-C ++。 Header文件是干净的Objective-C,所以Swift可以直接与之交谈。 您必须注意不要间接将任何C ++ – ish文件导入到Swift交互的头文件中。

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

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

下面的例子返回一个指向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 

内部源文件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; } 

这是我尝试使用铿锵声工具来自动化C ++ / swift通信。 你可以从Swift实例化C ++类,从C ++类inheritance,甚至在Swift中覆盖虚拟方法。
它将parsing你想要导出的C ++类到swift,并自动生成Objective-C / Objective-C ++桥。

https://github.com/sandym/swiftpp

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

我也有一个快速结合opencv的演示程序。

你可以从https://github.com/russj/swift_opencv3_demo下载它。;

有关演示http://flopalm.com/opencv-with-swift/的更多信息。;

不,不在一个文件中。

但是,您可以在Swift项目中使用C ++而无需静态库或框架。 就像其他人所说的那样,关键是要制作一个Objective-C桥接头文件,其中包含C兼容的C ++头文件,这些C头文件被标记为与extern“C”{}技巧兼容。

video教程: https : //www.youtube.com/watch?v = 0x6JbiphNS4

其他答案稍微不准确。 实际上你可以在同一个文件中混合使用Swift和[Objective-] C [++],尽pipe不是你期望的方式。

这个文件(c.swift)用swiftc编译成一个有效的可执行文件swiftc c.swiftclang -x objective-c c.swift

 /* /* */ #if 0 // */ import Foundation print("Hello from Swift!") /* /* */ #endif #include <stdio.h> int main() { puts("Hello from C!"); return 0; } // */ 

如果这对任何人都有帮助,我还可以从简单的Swift命令行工具中调用一个简单的C ++静态库。 这是一个概念性的代码片段。

没有涉及Objective-C,只是Swift和C ++。 C ++库中的代码由一个C ++包装程序调用,该包装程序通过extern“C”链接实现一个函数。 该函数然后在桥头被引用并从Swift中调用。

http://www.swiftprogrammer.info/swift_call_cpp.html

我在官方资源中提供了SE-0038的链接,这个链接描述为: 维护对Swift编程语言的改变和用户可见的增强的提议。

截至今天的状态是,这是已被接受但尚未计划的function请求。

此链接旨在引导任何正在寻找此function的人员朝着正确的方向前进