読者です 読者をやめる 読者になる 読者になる

そーす

福岡在住のプログラマ

Enumの総数を返すextension

f:id:saburesan:20160427075732p:plain

UICollectionViewで見た目が違うものに関してはSectionを使ってCellを切り替えたしするわけですが、私はそのSectionの種類をEnumで定義して使ってます。

その時にnumberOfSectionsInCollectionViewでセクションの総数を返す必要があるのですが、Enumの総数を返すメソッドは無いので定義しないといけません。しかし毎回定義するのは面倒なのでextension作りましょう。

Intを継承したEnumが対象

UICollectionViewではSectionを0から添字を振られます。Intを継承したEnumを作ることでデフォルトで定義順に0からrawValueに格納されるのでEnumの定義順とUICollectionViewのSectionの並びが一致しするので何かと便利です。 例えば設定画面を作る際に

// sections
enum Setting: Int {
 case UserName
 case EmailAddress
 case Profile
 case MyPost
}

//UICollectionView protocol
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let section = Setting(rawValue: section) {
            switch section {
            case .UserName: return 1
            case .EmailAddress: return registeredEmailAddress ? 1 : 0
            case .Profile: return 1
            case .MyPost: return 1
            }
        }
        return 0
    }

Extension

Intを継承したEnumを対象にextensionを作ります

extension RawRepresentable where RawValue == Int {
    static var count: Int {
        var count = 0
        while let _ = Self(rawValue: count) {
            count += 1
        }
        return count
    }
}

こうすることでIntを継承したEnumのみcountというプロパティにアクセスできます。

extensionにwhere使えるのめっちゃいいですよね

使おう

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return Setting.count
    }