Swift 与 C++混合编程的最佳实践

2018-02-09 14:11:05 +08:00
 fancymax

Swift 与 C++混合编程的最佳实践

大型 App 由于跨平台的需要,底层一般会采用 C++来实现,当时再往上到应用层的话基本都会用对应平台的语言,比如 Windows 可能会用 C#,Android 用 Kotlin,iOS 用 Swift。

我这里主要想探讨一下 Swift 与 C++ 混合编程最佳实践。

由于 Swift 无法直接调用 C++,所以不得已需要引入一个中间层包装 C++代码。

目前实践过两种方法

  1. C++ ==> Objective-C++ / Objective-C ==> Swift
  2. C++ ==> C ==> Swift

第一种做法比较自然,也是苹果教的方法。

但是存在一个问题,因为 Objective-C 都是以面向对象为导向的,所以封装 C++代码时 就需要用对象方式 在 Objective-C 中 建立模型。但是我其实希望 Objective-C 这一层尽量的薄,我们应该把所有的模型建立在 Swift 这一层,这样才能让代码的可维护性更好。

这样 就引出 第二种方式,直接用 C 封装 C++,仅仅是最简单的封装导出,而所有的对象模型建立在 Swift 这一层。目前感觉这种方式是优于第一种方式的。

不知道各位还有其他更好的方法不?

4007 次点击
所在节点    分享创造
8 条回复
skadi
2018-02-09 14:17:20 +08:00
extern "C" ?
skadi
2018-02-09 14:20:53 +08:00
是说在
cpp : node.getxxxx(args...)
c : node_getxxx(node*,args...)
StephenW
2018-02-09 14:33:05 +08:00
extern "C", modules 的形式去封装 C++的代码。
但你始终没法在 Swift 里面 OOP 地使用 C++,你始终需要 C API 的风格去调用。
不过好久没写 C Family 了,也不知道记的有差池不。。。
free9fw
2018-02-09 14:35:16 +08:00
Objective-C++应该好一点
expkzb
2018-02-09 16:57:05 +08:00
一般用 c++来实现哪些模块呢?
DingSoung
2018-02-09 17:03:12 +08:00
使用 modulemap
dawn009
2018-02-10 03:40:11 +08:00
我喜欢第二种。中间层尽量越简单越好。目前没发现更好的方法。
wizardforcel
2018-02-10 09:40:47 +08:00
第二种是通用的。只要一种编程语言可以 ffi 就能用。

如果以后你还想移植 python 或者其他的地方也不用改代码。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429752

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX