Swiftのcore部分が公開された!
さて、今朝Swiftがオープンソースとして公開されました みなさま、仕事なんてやってる場合じゃねえというテンションになってることと思います。
C++やLLVMについては残念ながら知見がなく見てもなかなかピンと来るところがないのですが、今回のオープンソース化ではSwiftのCore部分ももちろん公開されています。こちらについては、いつも利用している機能たちがどのようにして実現されているのかを、Swiftのコードで読むことが出来るのでなかなかテンションがあがります。
SwiftのCore部分のソースコードは以下のリディレクトリに配置されており自由に閲覧することができます。
例えば下記のOptional.swiftは、Optionalの実装ファイルです。
mapの実装を見てみる
中を見てみると、例えばOptional型に対するmapの実装は下記の様になっています。
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の実装も覗いてみましょう。
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重にするという機能を実現することが出来ているのがわかります。
??の実装
他にも、いつもお世話になっている??
の実装なども同じファイルに実装されています。
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を!