Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Enumerate

3,964 views

Published on

potatotips #24での発表内容です http://connpass.com/event/23065/

Published in: Technology
  • Be the first to comment

Enumerate

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

×