オープンソースとなったSwift coreの実装を覗いてみよう 。例えばOptional.swift。


Swiftのcore部分が公開された!

さて、今朝Swiftがオープンソースとして公開されました みなさま、仕事なんてやってる場合じゃねえというテンションになってることと思います。

C++やLLVMについては残念ながら知見がなく見てもなかなかピンと来るところがないのですが、今回のオープンソース化ではSwiftのCore部分ももちろん公開されています。こちらについては、いつも利用している機能たちがどのようにして実現されているのかを、Swiftのコードで読むことが出来るのでなかなかテンションがあがります。

SwiftのCore部分のソースコードは以下のリディレクトリに配置されており自由に閲覧することができます。

例えば下記のOptional.swiftは、Optionalの実装ファイルです。

mapの実装を見てみる

中を見てみると、例えばOptional型に対するmapの実装は下記の様になっています。

Optional.swift
 public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U? {
    switch self {
    case .Some(let y):
      return .Some(try f(y))
    case .None:
      return .None
    }
  }

ご存知の様にOptional型の実態は.Some(Wrapped)Noneからなる列挙型です。なので、switch selfして、.Someだったならばfという関数(mapの引数で渡されたクロージャ)を現在Wrappedしてる中身に適用して、その結果を包んだ.Someをreturnするという実装になっています。.Noneだったならばそのまま.Noneをreturnする、というシンプルな実装ですね。

flatMapの実装を見てみる

せっかくなので、次はOptionalに対するflatMapの実装も覗いてみましょう。

Optional.swift
  public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U? {
    switch self {
    case .Some(let y):
      return try f(y)
    case .None:
      return .None
    }
  }

ほぼ同じなのですが、注目すべきは先ほどのmapの実装では.Some(try f(y))となっていた部分がtry f(y)となっているところです。.Someに包むことなく直接 f(y)の結果をreturnしていることがわかります。これにより、flatMapにより2重になっていたOptionalの箱を1重にするという機能を実現することが出来ているのがわかります。

??の実装

他にも、いつもお世話になっている??の実装なども同じファイルに実装されています。

Optional.swift
public func ?? <T> (optional: T?, @autoclosure defaultValue: () throws -> T?)
    rethrows -> T? {
  switch optional {
  case .Some(let value):
    return value
  case .None:
    return try defaultValue()
  }
}

元々公開されていた宣言から大体わかる話ではあるのですが、@autoclosureを利用してdefaultValue()の遅延実行を実施していることがわかります。case .Someの場合はreturn valueをするので、defaultValue()は実行されることがなく、.NoneのときのみdefaultValue()が評価され実行される、という実装です。

他にもいろいろ見てみよう

Swiftのcoreだけでなく、Foundationについても同様にオープンソースとして公開されています。普段利用している標準の機能がどのようにして実現されているかをみるのは、面白いし勉強にもなるので、みんなでじゃんじゃん覗いてみましょう!

みんな大好きNSObjectや
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSObject.swift

なるほど、、、という感じのNSNullの中身をみることもできます。
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSNull.swift

では、みなさま良きSwift Lifeを!