Skip to content

Instantly share code, notes, and snippets.

@externvoid
Last active December 17, 2023 02:18
Show Gist options
  • Save externvoid/8f13a5e590343bdd3fc3341a1192ede5 to your computer and use it in GitHub Desktop.
Save externvoid/8f13a5e590343bdd3fc3341a1192ede5 to your computer and use it in GitHub Desktop.
都道府県・列挙体[【Swift 5.1】enumで複数のRawValueを扱う - Qiita](https://qiita.com/takehito-koshimizu/items/640158e91491e0e8e575) 、Swift5.8でも動くように修正
/// Caseiterable.swift
extension CaseIterable where Self: Equatable {
var offset: AllCases.Index {
Self.allCases.firstIndex(of: self)!
}
}
/// PrefectureCode.swift
/// 都道府県コード
enum PrefectureCode: Int, CaseIterable {
case hokkaido = 1
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
}
// MARK: -
extension PrefectureCode {
/// 都道府県コード
var code: Int { rawValue }
}
/// PrefectureName.swift
/// 都道府県名
enum PrefectureName: String, CaseIterable {
case 北海道
case 青森県
case 岩手県
case 宮城県
case 秋田県
case 山形県
case 福島県
case 茨城県
case 栃木県
case 群馬県
case 埼玉県
case 千葉県
case 東京都
case 神奈川県
case 新潟県
case 富山県
case 石川県
case 福井県
case 山梨県
case 長野県
case 岐阜県
case 静岡県
case 愛知県
case 三重県
case 滋賀県
case 京都府
case 大阪府
case 兵庫県
case 奈良県
case 和歌山県
case 鳥取県
case 島根県
case 岡山県
case 広島県
case 山口県
case 徳島県
case 香川県
case 愛媛県
case 高知県
case 福岡県
case 佐賀県
case 長崎県
case 熊本県
case 大分県
case 宮崎県
case 鹿児島県
case 沖縄県
}
// MARK: -
extension PrefectureName {
/// 都道府県名
var name: String { rawValue }
}
/// Prefecture.swift
/// 都道府県
@dynamicMemberLookup
public enum Prefecture: CaseIterable {
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
subscript<V>(dynamicMember keyPath: KeyPath<PrefectureCode, V>) -> V? {
self[keyPath]
}
subscript<V>(dynamicMember keyPath: KeyPath<PrefectureName, V>) -> V? {
self[keyPath]
}
}
// MARK: -
public extension Prefecture {
/// 都道府県コードで初期化
init?(code: Int) {
self.init(PrefectureCode(rawValue: code))
}
/// 都道府県名で初期化
init?(name: String) {
self.init(PrefectureName(rawValue: name))
}
}
// MARK: -
private extension Prefecture {
init?<T>(_ object: T?) where T: CaseIterable, T.AllCases.Index == AllCases.Index, T: Equatable {
switch object {
case let object? where object.offset < Self.allCases.endIndex:
self = Self.allCases[object.offset]
case _:
return nil
}
}
subscript<T, V>(_ keyPath: KeyPath<T, V>) -> V? where T: CaseIterable, T.AllCases.Index == AllCases.Index {
(offset < T.allCases.endIndex) ? T.allCases[offset][keyPath: keyPath] : nil
}
}
print(Prefecture.hokkaido.name!) // => 北海道
// print(Prefecture.hokkaido.code!) // => 1
// print(Prefecture(code: 1)!.name!) // => 北海道
print("\n")
print(Prefecture(name: "北海道")!.code!) // => 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment