2019/01/22
Swift4.0→4.2でEnumEnumerableが不要になった
iOS12.0 対応で Xcode 10 にして Swift 4.2 対応した。
基本的にAll Fix Issuesでポチポチやれば良いが、
Enumのcountが取れずテーブルビューが表示されなくなった。
これまではEnumを自前で実装する必要があったので、
EnumEnumerableを使っていたが、Swift4.2の新機能CaseIterableでいけることに気付いた。
対象
– EnumEnumerable
使ってたやつ
EnumEnumerable
protocol EnumEnumerable {
    associatedtype Case = Self
}
extension EnumEnumerable where Case: Hashable {
    private static var iterator: AnyIterator<Case> {
        var n = 0
        return AnyIterator {
            defer { n += 1 }
            let next = withUnsafePointer(to: &n) {
                UnsafeRawPointer($0).assumingMemoryBound(to: Case.self).pointee
            }
            return next.hashValue == n ? next : nil
        }
    }
    static func enumerate() -> EnumeratedSequence<AnySequence<Case>> {
        return AnySequence(self.iterator).enumerated()
    }
    static var cases: [Case] {
        return Array(self.iterator)
    }
    static var count: Int {
        return self.cases.count
    }
}CaseIterable
リファレンス: https://developer.apple.com/documentation/swift/caseiterable
Swift 4.2 では enum の件数が自前で実装しなくてもとれるようになった。
enum Element: CaseIterable { case hoge, piyo, fuga, hogehoge }
Element.allCases         // returns some Collection whose Iterator.Element is Element
Element.allCases.count   // returns 4
Array(Element.allCases)  // returns [hoge, piyo, fuga, hogehoge]結論
- EnumEnumerable削除
- “EnumEnumerable” → “CaseIterable”にReplace
- 一度ビルドしてエラーの箇所を.count→.allCases.countに修正
.countをReplaceで一気にやれればいいけど、Enum以外も引っかかってしまうのでそこはちょっと面倒でした。

