V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
fancymax
V2EX  ›  分享创造

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

  •  
  •   fancymax ·
    fancymax · 2018-02-09 14:11:05 +08:00 · 4000 次点击
    这是一个创建于 2260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 这一层。目前感觉这种方式是优于第一种方式的。

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

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

    如果以后你还想移植 python 或者其他的地方也不用改代码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1411 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:24 · PVG 01:24 · LAX 10:24 · JFK 13:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.