iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

ABI Stability とは?

今回は、Swift5.0・Swift5.1 でそれぞれ対応された、ABI Stability と Module Stability について簡単にまとめてめてみたいと思います。

ABI Stability とは?

ABI Stability は異なるバージョンのコンパイラから生成されたバイナリ同士をリンクできるようにするための機能で、Swift5.0 からサポートされました。これにより、standard library や runtime library などをアプリごとに含める必要がなくなり、アプリバンドルのサイズを削減できるようになりました。

swift.org

Module Stability とは?

Module Stability は異なるバージョンのコンパイラから生成された Module をコンパイル(≒インポート)できるようにするための機能で、Swift5.1 からサポートされました。これにより、Swift5.1 以降でコンパイルされた Module は、Swift5.1 以降に違うバージョンのコンパイラから正常にインポートできるようになります。ただし、これには、.swiftinterface というモジュール記述ファイルが必要で、ライブラリ側で BUILD_LIBRARY_FOR_DISTRIBUTIONYes に設定されていない場合には、.swiftinterface が生成されず、Module Stability の恩恵を受けることができません。

forums.swift.org

余談

上記のことを踏まえて、Xcode のアップデート作業を行っていると、ライブラリのバージョンを更新していないのにも(BUILD_LIBRARY_FOR_DISTRIBUTIONNo) 関わらず Swift5.2.2 から Swift5.2.4 では、問題なくバイナリをコンパイル・リンクできてしまいました🤔 後々調べて見ると、swift4.0swift4.0.1swift4.0.2 以外のバージョンでは(3.1~4.2.1の話)、基本的に major・minor が合っていればバイナリ互換性があるようで、今回のように Swift5.2.2 から Swift5.2.4 ではライブラリをビルドする必要がなかったようです✍️ とはいえ、major・minor のアップデートがあると、また面倒な rebuild 作業をしなくてはならないので、徐々に Module Stability を活用していきたいところです😅

https://qiita.com/gamako/items/c12edf77fe0632903b77#%E3%81%BE%E3%81%A8%E3%82%81

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com