enumerate

35

Upload: motoki-narita

Post on 22-Jan-2018

3.920 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Enumerate
Page 2: Enumerate

自己紹介

• @mo_to_44

• 株式会社ネクストで  HOME’Sという 不動産検索アプリのiOSエンジニアをやっています

Page 3: Enumerate

個人でもアプリ作ってます

  リボカメ - Revolver Camera

• リボルバーを模したUI

• フィルターをリアルタイムで切り替え、確認できる

• Apple Watch対応

Page 4: Enumerate

shibuya.swift #2http://www.slideshare.net/motokinarita7/swift30-enumerate

Page 5: Enumerate

swift-evolutionhttps://github.com/apple/swift-evolution

Page 6: Enumerate

Swift 3.0 で導入されることが議論されている

Page 7: Enumerate

0004: Remove the ++ and -- operators🎉 Status: Accepted

Page 8: Enumerate

0007: Remove C-style for-loops with conditions and incrementers

🎉 Status: Accepted

Page 9: Enumerate

どうするのか?

Page 10: Enumerate

enumerate

• SequenceType Protocolに定義されている

• indexと要素のペア(タプル)の配列を取得することができる

Page 11: Enumerate

shibuya.swift #2http://www.slideshare.net/motokinarita7/swift30-enumerate

Swift 3.0に向けて• C言語スタイルのfor文ではなく、enumerateを積極的に使っていく

• 同様に ++ や -- も使わないようにする

• swift-evolution/proposal に目を通して、なくなるかもしれない文法はなるべく使わないようにする

Page 12: Enumerate

enumerateはどう実装されているのか?

Page 13: Enumerate

ソースを見てみる

Page 14: Enumerate

enumerateは/stdlib/public/core/SequenceAlgorithms.swift.gyb にSequenceTypeのProtocol Extensionで定義

https://github.com/apple/swift/blob/master/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 15: Enumerate

enumerateは/stdlib/public/core/SequenceAlgorithms.swift.gyb にSequenceTypeのProtocol Extensionで定義

https://github.com/apple/swift/blob/master/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 16: Enumerate

ちょいちょい出てくる.gyb

• Generate Your Boilerplateの略と、/blob/master/utils/gyb.py に記載がある

• Swiftのプロジェクトで使われているテンプレート形式

reference: Optionalな文字列同士を良い感じに結合する(ついでにreduceとflatMapの実装を覗いてみる) http://qiita.com/kazu0620/items/f2a6272c6b8b7bcbaa42

Page 17: Enumerate

SequenceTypeのProtocol Extension

/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 18: Enumerate

戻り値はEnumerateSequence型

/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 19: Enumerate

@warn_unused_resultでこの関数を使っていて戻り値が使われていない場合に警告を出す

/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 20: Enumerate

戻り値はEnumerateSequence型

/stdlib/public/core/SequenceAlgorithms.swift.gyb

Page 21: Enumerate

EnumerateSequenceは /stdlib/public/core/Algorithm.swift に定義されている

Page 22: Enumerate

EnumerateSequenceはSequenceTypeプロトコルを採用したstruct

/stdlib/public/core/Algorithm.swift

Page 23: Enumerate

SequenceTypeプロトコル

• SequenceTypeはgenerateメソッドを実装する必要がある

• そのgenerateメソッドの戻り値はGeneratorType

Page 24: Enumerate

EnumerateSequenceのgenerateの戻り値はEnumerateGenerator型

/stdlib/public/core/Algorithm.swift

Page 25: Enumerate

EnumerateGeneratorはEnumerateSequenceと同じく /stdlib/public/core/Algorithm.swift に定義されている

Page 26: Enumerate

GeneratorTypeプロトコル• for-in文で利用できるようにするためには、さきほどのSequenceTypeとGeneratorTypeを実装する必要がある(とのこと)

• GeneratorTypeは next メソッドを実装する必要がある

• この next メソッドの戻り値がfor-inの中で渡ってくる値

Page 27: Enumerate

/stdlib/public/core/Algorithm.swift

EnumerateGeneratorのnextメソッドでタプルを返している!!

Page 28: Enumerate

/stdlib/public/core/Algorithm.swift

EnumerateGenerator(struct)はbaseとcountをプロパティとして保持している

Page 29: Enumerate

/stdlib/public/core/Algorithm.swift

初期化時、EnumerateGeneratorの countプロパティは0

Page 30: Enumerate

/stdlib/public/core/Algorithm.swift

for-inなどでnextが呼ばれるたびにEnumerateGeneratorのcountプロパティをインクリメント

Page 31: Enumerate

/stdlib/public/core/Algorithm.swift

++ はSwift3.0でなくなるので、そのうち実装が修正されるはず

Page 32: Enumerate

まとめ

Page 33: Enumerate

まとめ• enumerateはEnumerateSequenceとEnumerateGeneratorで実装されている

• ++ を使用しているので、Swift3.0のリリース時には修正されているはず

Page 34: Enumerate

ソース読んでみた感想• Swiftのオープンソース化で気になったことはソースを見れるようになったのは便利

• 分からないことがどんどん出てきてかなりビビる

• 勉強不足...

Page 35: Enumerate

おわり