tmp
Wednesday, November 11, 2015
Swift の enum の要素数取得とループについて
表題を実現する方法について 次の`enum`を例とする ```swift enum MyColor: Int { case Red case Green case Blue } ``` ##Countの実現方法 `enum`のcountが欲しい時があるが、手法がいくつかあるので上げていく ###ダミーの要素を一番後ろに追加する方法 ダミーの要素`_count`を追加 ```swift enum MyColor: Int { case Red case Green case Blue case _count static let count = _count.rawValue } print(MyColor.count) // 3 ``` ぱっと見良さげだが`switch`した時に`default`を考慮する必要が出てきて面倒 ```swift let color = MyColor.Red switch color { case .Red: print("red") case .Green: print("green") case .Blue: print("blue") default: break // 記述しないとエラー } ``` ###一番後ろの要素+1する方法 要素を追加した場合に`count`の中身も気にしないといけない ```swift enum MyColor: Int { case Red case Green case Blue static let count: Int = { return Blue.rawValue + 1 }() } print(MyColor.count) // 3 ``` ###ループを回して取得する方法 見た目ごちゃごちゃしてるけど余計な要素や、要素追加時に気にしなくていいので良さげ ```swift enum MyColor: Int { case Red case Green case Blue static let count: Int = { var i = 0 while let _ = MyColor(rawValue: ++i) {} return i }() } print(MyColor.count) // 3 ``` ##Loopの実現方法 `enum`の要素をループで回したい場合 generatorを用いて`enumerate`を実装 ```swift enum MyColor: Int { case Red case Green case Blue static var enumerate: AnySequence
{ return AnySequence { () -> AnyGenerator
in var i = 0 return anyGenerator { () -> MyColor? in MyColor(rawValue: i++) } } } } print(Array(MyColor.enumerate).count) // 3 for color in MyColor.enumerate { print(color) // Red, Green, Blue } ``` ##Protocol ExtensionでenumのCount, Loopを実装する 必要な`enum`に対して毎回`enumerate`を実装するのも手間なのでProtocolにする ```swift protocol Enumerable { typealias Element = Self } extension Enumerable where Element: RawRepresentable, Element.RawValue == Int { static var enumerate: AnySequence
{ return AnySequence { () -> AnyGenerator
in var i = 0 return anyGenerator { () -> Element? in Element(rawValue: i++) } } } static var elements: [Element] { return Array(enumerate) } } enum MyColor: Int, Enumerable { case Red case Green case Blue } print(MyColor.elements.count) // 3 for color in MyColor.elements { print(color) // Red, Green, Blue } ``` Count, Loopが必要な`enum`に対して`Enumerable`を付けると`elements`で要素のArrayを取得できる ##参考 * http://stackoverflow.com/questions/27094878/how-do-i-get-the-count-of-a-swift-enum * http://qiita.com/takabosoft/items/ecb4f0c1d747acdacf4d
No comments:
Post a Comment
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment