enumerate

Post on 22-Jan-2018

3.920 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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のオープンソース化で気になったことはソースを見れるようになったのは便利

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

• 勉強不足...

おわり

top related