Last active
December 17, 2023 02:18
-
-
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でも動くように修正
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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