enumerate
TRANSCRIPT
自己紹介
• @mo_to_44
• 株式会社ネクストで HOME’Sという 不動産検索アプリのiOSエンジニアをやっています
個人でもアプリ作ってます
リボカメ - Revolver Camera
• リボルバーを模したUI
• フィルターをリアルタイムで切り替え、確認できる
• Apple Watch対応
shibuya.swift #2http://www.slideshare.net/motokinarita7/swift30-enumerate
swift-evolutionhttps://github.com/apple/swift-evolution
Swift 3.0 で導入されることが議論されている
0004: Remove the ++ and -- operators🎉 Status: Accepted
0007: Remove C-style for-loops with conditions and incrementers
🎉 Status: Accepted
どうするのか?
enumerate
• SequenceType Protocolに定義されている
• indexと要素のペア(タプル)の配列を取得することができる
shibuya.swift #2http://www.slideshare.net/motokinarita7/swift30-enumerate
Swift 3.0に向けて• C言語スタイルのfor文ではなく、enumerateを積極的に使っていく
• 同様に ++ や -- も使わないようにする
• swift-evolution/proposal に目を通して、なくなるかもしれない文法はなるべく使わないようにする
enumerateはどう実装されているのか?
ソースを見てみる
enumerateは/stdlib/public/core/SequenceAlgorithms.swift.gyb にSequenceTypeのProtocol Extensionで定義
https://github.com/apple/swift/blob/master/stdlib/public/core/SequenceAlgorithms.swift.gyb
enumerateは/stdlib/public/core/SequenceAlgorithms.swift.gyb にSequenceTypeのProtocol Extensionで定義
https://github.com/apple/swift/blob/master/stdlib/public/core/SequenceAlgorithms.swift.gyb
ちょいちょい出てくる.gyb
• Generate Your Boilerplateの略と、/blob/master/utils/gyb.py に記載がある
• Swiftのプロジェクトで使われているテンプレート形式
reference: Optionalな文字列同士を良い感じに結合する(ついでにreduceとflatMapの実装を覗いてみる) http://qiita.com/kazu0620/items/f2a6272c6b8b7bcbaa42
SequenceTypeのProtocol Extension
/stdlib/public/core/SequenceAlgorithms.swift.gyb
戻り値はEnumerateSequence型
/stdlib/public/core/SequenceAlgorithms.swift.gyb
@warn_unused_resultでこの関数を使っていて戻り値が使われていない場合に警告を出す
/stdlib/public/core/SequenceAlgorithms.swift.gyb
戻り値はEnumerateSequence型
/stdlib/public/core/SequenceAlgorithms.swift.gyb
EnumerateSequenceは /stdlib/public/core/Algorithm.swift に定義されている
EnumerateSequenceはSequenceTypeプロトコルを採用したstruct
/stdlib/public/core/Algorithm.swift
SequenceTypeプロトコル
• SequenceTypeはgenerateメソッドを実装する必要がある
• そのgenerateメソッドの戻り値はGeneratorType
EnumerateSequenceのgenerateの戻り値はEnumerateGenerator型
/stdlib/public/core/Algorithm.swift
EnumerateGeneratorはEnumerateSequenceと同じく /stdlib/public/core/Algorithm.swift に定義されている
GeneratorTypeプロトコル• for-in文で利用できるようにするためには、さきほどのSequenceTypeとGeneratorTypeを実装する必要がある(とのこと)
• GeneratorTypeは next メソッドを実装する必要がある
• この next メソッドの戻り値がfor-inの中で渡ってくる値
/stdlib/public/core/Algorithm.swift
EnumerateGeneratorのnextメソッドでタプルを返している!!
/stdlib/public/core/Algorithm.swift
EnumerateGenerator(struct)はbaseとcountをプロパティとして保持している
/stdlib/public/core/Algorithm.swift
初期化時、EnumerateGeneratorの countプロパティは0
/stdlib/public/core/Algorithm.swift
for-inなどでnextが呼ばれるたびにEnumerateGeneratorのcountプロパティをインクリメント
/stdlib/public/core/Algorithm.swift
++ はSwift3.0でなくなるので、そのうち実装が修正されるはず
まとめ
まとめ• enumerateはEnumerateSequenceとEnumerateGeneratorで実装されている
• ++ を使用しているので、Swift3.0のリリース時には修正されているはず
ソース読んでみた感想• Swiftのオープンソース化で気になったことはソースを見れるようになったのは便利
• 分からないことがどんどん出てきてかなりビビる
• 勉強不足...
おわり