SwiftのSDK overlayとswift-corelibs-foundation

SDK overlay

SwiftのSDK overlayというものを耳にしたことはあるでしょうか?これはSwiftのOSSプロジェクトであるapple/swiftの開発において、FoundationやAppKit、UIKitなどのObjective-Cで書かれたシステムフレームワークに対し、SwiftらしいAPIを提供するための拡張レイヤーです。

https://github.com/apple/swift/tree/master/stdlib/public/SDK

Swift 3で、NSDateに対するDateNSURLに対するURLなど、参照型と対応する複数の値型がFoundationに追加された*1のを覚えている人も多いかと思います。これらの値型はもちろんSwiftで実装されているわけですが、これも実はSDK overlayの一部です(この場合はFoundationのoverlay)。こう聞くと、SDK overlayが少しは身近に感じられないでしょうか。

swift-corelibs-foundation

ここで話は変わります。Swiftの標準ライブラリに次ぐコアライブラリであるFoundationはObjective-Cで実装されているため、そのままではLinuxなどのDarwin以外のプラットフォームでは使用できません。これではせっかくSwift自体がLinuxに対応しても、種々の機能不足に悩まされたり、クロスプラットフォームのライブラリの開発に支障をきたしてしまいます。

この状態を解消するために、SwiftのOSS化と共に公開されたのがswift-corelibs-foundationです。このリポジトリは、FoundationのベースとなっているCoreFoundationというC実装のフレームワークを使い、FoundationをSwiftで再実装するというものです。

Foundation overlayとswift-corelibs-foundationの同期

さて、Foundationの再実装と聞いて気になった人はいないでしょうか?Objective-C版のFoundationへの追加レイヤーであったoverlayはどうなるのでしょうか。答えは、Foundation overlayはswift-corelibs-foundationの側でも実装される必要があるのです*2

こうして、apple/swiftとswift-corelibs-foundationの間でFoundation overlayの実装を同期する必要が出てきます。例えばNSStringAPI.swiftのコメントに書かれているように、一方を更新したらもう一方を更新するのを忘れないようにしなければなりません。実際、一方にプルリクエストを出すと、もう一方にもプルリクエストを出してくれとレビュワーからも依頼されることがあります。

とはいえ人間忘れてしまうもので、どうしても内容の乖離は発生しています。しかしこれは見方を変えればコントリビューションチャンスですね!?

2つのリポジトリ間での差分を見つけて、より新しい方の内容をもう一方に反映することは、SwiftのOSSプロジェクトに参加する一歩目としては比較的とっかかりやすいと思います。Foundationに興味があるあなた、まずはここから始めてみませんか?

おわりに

この記事を機に、Swift開発するだけでなく、Swift開発することに興味を持つ、取り組んでくれる人が増えれば幸いです。数少ない日本のSwiftコミッターからは以上です。


この記事ははてなエンジニア Advent Calendar 2017の9日目の記事です。

昨日8日目はid:aerealさんの大コンテナ時代を生きのこるためのJSON Schemaでした。

明日10日目はid:nanto_viさんの担当です!

*1:SE-0069: Mutability and Foundation Value Types

*2:後者においては実装の一部となるため、overlayとは呼ばないのですが。