Swiftで都道府県データ（地域区分つき）

## 概要
enumを使い域区分（[八地方区分](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%9C%B0%E5%9F%9F)）を含んだ都道府県データを作成しました。
自由に使ってもらって大丈夫です。

## 使用イメージ

<img width="375" alt="Simulator Screen Shot - iPhone 8 - 2018-05-06 at 17.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/103299/bd7f5566-a9b5-d76e-a379-32dbdc353f7f.png">



人間が一度に把握できる物の数はおおよそ７個前後なので、それを超える数の項目を表示する場合は、グルーピングするのが望ましいと言われている。

そのため都道府県一覧を表示する際も、４７都府県を全て連続で表示するのではなく、画像のように地域ごとに分類するのが良いだろう。

## enumの使い方
後述の"サンンプルTableViewController"のコードを参考。


## コード
### 都道府県 enum
	/*
	 raw valueはtable view等でindex等からcaseを作成するために、0からスタート。
	 都道府県のidは1から始まる連番なので、raw valueをそのままidとしては使えない。
	*/
	enum JapanesePrefecture: Int {
	    
	    // 北海道
	    case hokkaido
	    
	    // 東北
	    case aomori
	    case iwate
	    case miyagi
	    case akita
	    case yamagata
	    case fukushima
	    
	    // 関東
	    case ibaraki
	    case tochigi
	    case gunma
	    case saitama
	    case chiba
	    case tokyo
	    case kanagawa
	    
	    // 中部
	    case niigata
	    case toyama
	    case ishikawa
	    case fukui
	    case yamanashi
	    case nagano
	    case gifu
	    case shizuoka
	    case aichi
	    
	    // 関西
	    case mie
	    case shiga
	    case kyoto
	    case osaka
	    case hyogo
	    case nara
	    case wakayama
	    
	    // 中国
	    case tottori
	    case shimane
	    case okayama
	    case hiroshima
	    case yamaguchi
	    
	    //　四国
	    case tokushima
	    case kagawa
	    case ehime
	    case kochi
	    
	    // 九州
	    case fukuoka
	    case saga
	    case nagasaki
	    case kumamoto
	    case oita
	    case miyazaki
	    case kagoshima
	    case okinawa
	    
	    
	    /*
	     都道府県に振り分けられたidは1から始まる連番。raw valueと同じではない点に注意。
	    */
	    var id: Int { return self.rawValue + 1 }
	    
	    
	    /*
	     suffix(都、府、県)を取り除いた文字列。
	     北海道は"道"をつけたままの文字列。
	    */
	    var name: String {
	        switch self {
	        
	        // 北海道
	        case .hokkaido: return "北海道"
	        
	        // 東北
	        case .aomori   : return "青森"
	        case .iwate    : return "岩手"
	        case .miyagi   : return "宮城"
	        case .akita    : return "秋田"
	        case .yamagata : return "山形"
	        case .fukushima: return "福島"
	            
	        // 関東
	        case .ibaraki : return "茨城"
	        case .tochigi : return "栃木"
	        case .gunma   : return "群馬"
	        case .saitama : return "埼玉"
	        case .chiba   : return "千葉"
	        case .tokyo   : return "東京"
	        case .kanagawa: return "神奈川"
	            
	        // 中部
	        case .niigata  : return "新潟"
	        case .toyama   : return "富山"
	        case .ishikawa : return "石川"
	        case .fukui    : return "福井"
	        case .yamanashi: return "山梨"
	        case .nagano   : return "長野"
	        case .gifu     : return "岐阜"
	        case .shizuoka : return "静岡"
	        case .aichi    : return "愛知"
	        
	        // 関西
	        case .mie     : return "三重"
	        case .shiga   : return "滋賀"
	        case .kyoto   : return "京都"
	        case .osaka   : return "大阪"
	        case .hyogo   : return "兵庫"
	        case .nara    : return "奈良"
	        case .wakayama: return "和歌山"
	            
	        // 中国
	        case .tottori  : return "鳥取"
	        case .shimane  : return "島根"
	        case .okayama  : return "岡山"
	        case .hiroshima: return "広島"
	        case .yamaguchi: return "山口"
	            
	        // 四国
	        case .tokushima: return "徳島"
	        case .kagawa   : return "香川"
	        case .ehime    : return "愛媛"
	        case .kochi    : return "高知"
	            
	        // 九州
	        case .fukuoka  : return "福岡"
	        case .saga     : return "佐賀"
	        case .nagasaki : return "長崎"
	        case .kumamoto : return "熊本"
	        case .oita     : return "大分"
	        case .miyazaki : return "宮崎"
	        case .kagoshima: return "鹿児島"
	        case .okinawa  : return "沖縄"
	        }
	    }
	    
	    /*
	     nameに"都、府、県"を追加した文字列。
	     北海道はname, nameWithSuffix共に同一の文字列"北海道"が返る。
	    */
	    var nameWithSuffix: String {
	        switch self {
	        case .hokkaido: return self.name
	        default: return self.name + self.suffix
	        }
	    }
	    
	    var suffix: String {
	        switch self {
	        case .hokkaido     : return "道"
	        case .tokyo        : return "都"
	        case .kyoto, .osaka: return "府"
	        default            : return "県"
	        }
	    }
	    
	    static var all: [JapanesePrefecture] {
	        return [
	        // 北海道
	        .hokkaido,
	        
	        // 東北
	        .aomori,
	        .iwate,
	        .miyagi,
	        .akita,
	        .yamagata,
	        .fukushima,
	        
	        // 関東
	        .ibaraki,
	        .tochigi,
	        .gunma,
	        .saitama,
	        .chiba,
	        .tokyo,
	        .kanagawa,
	        
	        // 中部
	        .niigata,
	        .toyama,
	        .ishikawa,
	        .fukui,
	        .yamanashi,
	        .nagano,
	        .gifu,
	        .shizuoka,
	        .aichi,
	        
	        // 関西
	        .mie,
	        .shiga,
	        .kyoto,
	        .osaka,
	        .hyogo,
	        .nara,
	        .wakayama,
	        
	        // 中国
	        .tottori,
	        .shimane,
	        .okayama,
	        .hiroshima,
	        .yamaguchi,
	        
	        //　四国
	        .tokushima,
	        .kagawa,
	        .ehime,
	        .kochi,
	        
	        // 九州
	        .fukuoka,
	        .saga,
	        .nagasaki,
	        .kumamoto,
	        .oita,
	        .miyazaki,
	        .kagoshima,
	        .okinawa,
	        ]
	    }
	}
### 地域区分　enum
	enum JapaneseRegion: Int {
	    case hokkaido
	    case tohoku
	    case kanto
	    case chubu
	    case kansai
	    case chugoku
	    case shikoku
	    case kyushu
	    
	    var id: Int { return self.rawValue + 1 }
	    
	    var name: String {
	        switch self {
	        case .hokkaido: return "北海道"
	        case .tohoku:   return "東北"
	        case .kanto:    return "関東"
	        case .chubu:    return "中部"
	        case .kansai:   return "関西"
	        case .chugoku:  return "中国"
	        case .shikoku:  return "四国"
	        case .kyushu:   return "九州"
	        }
	    }
	    
	    var prefectures: [JapanesePrefecture] {
	        switch self {
	        case .hokkaido: return [
	                .hokkaido
	            ]
	        case .tohoku: return [
	                .aomori,
	                .iwate,
	                .miyagi,
	                .akita,
	                .yamagata,
	                .fukushima
	            ]
	        case .kanto: return [
	                .ibaraki,
	                .tochigi,
	                .gunma,
	                .saitama,
	                .chiba,
	                .tokyo,
	                .kanagawa
	            ]
	        case .chubu: return [
	                .niigata,
	                .toyama,
	                .ishikawa,
	                .fukui,
	                .yamanashi,
	                .nagano,
	                .gifu,
	                .shizuoka,
	                .aichi
	            ]
	        case .kansai: return [
	                .mie,
	                .shiga,
	                .kyoto,
	                .osaka,
	                .hyogo,
	                .nara,
	                .wakayama
	            ]
	        case .chugoku: return [
	                .tottori,
	                .shimane,
	                .okayama,
	                .hiroshima,
	                .yamaguchi
	            ]
	        case .shikoku: return [
	                .tokushima,
	                .kagawa,
	                .ehime,
	                .kochi
	            ]
	        case .kyushu: return [
	                .fukuoka,
	                .saga,
	                .nagasaki,
	                .kumamoto,
	                .oita,
	                .miyazaki,
	                .kagoshima,
	                .okinawa
	            ]
	        }
	        
	    }
	    
	    static var all: [JapaneseRegion] {
	        return [
	            .hokkaido,
	            .tohoku,
	            .kanto,
	            .chubu,
	            .kansai,
	            .chugoku,
	            .shikoku,
	            .kyushu
	        ]
	    }
	}

### サンプルTableView
	import UIKit
	
	class PrefecturesViewController: UITableViewController {
	    
	    // MARK: : Property
	    
	    let cellId = "cell"
	    typealias Cell = UITableViewCell
	    var regions: [JapaneseRegion] = JapaneseRegion.all
	    
	    
	    
	    // MARK: - Lifecycle
	    
	    override func viewDidLoad() {
	        super.viewDidLoad()
	        tableView.register(Cell.self, forCellReuseIdentifier: cellId)
	    }
	    
	    
	    
	    // MARK: - Table view data source
	    
	    override func numberOfSections(in tableView: UITableView) -> Int {
	        return regions.count
	    }
	    
	    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
	        guard let region = JapaneseRegion(rawValue: section) else { return 0 }
	        return region.prefectures.count
	    }
	    
	    
	    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
	        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! Cell
	        guard let prefecture = JapaneseRegion(rawValue: indexPath.section)?.prefectures[indexPath.row] else { return cell }
	        cell.textLabel?.text = prefecture.name
	        return cell
	    }
	    
	    
	    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
	        return regions[section].name
	    }
	}