10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-06

概要

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
    }
}
10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?