iOS
サンプル
enum
Swift

Swiftで都道府県データ(地域区分つき)

概要

enumを使い域区分(八地方区分)を含んだ都道府県データを作成しました。
自由に使ってもらって大丈夫です。

使用イメージ

Simulator Screen Shot - iPhone 8 - 2018-05-06 at 17.01.26.png

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

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

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
    }
}