1. ホーム
  2. swift

[解決済み】Swiftで列挙型の値の名前を取得する方法は?

2022-04-16 16:26:17

質問

列挙に生の Integer の値を指定します。

enum City: Int {
  case Melbourne = 1, Chelyabinsk, Bursa
}

let city = City.Melbourne

を変換するにはどうすればよいですか? city の値を文字列に変換します。 Melbourne ? このような型名イントロスペクションは、この言語では可能なのでしょうか?

のようなものです(このコードは動作しません)。

println("Your city is \(city.magicFunction)")
> Your city is Melbourne

解決方法は?

Xcode 7 beta 5 (Swift バージョン 2) では、型名と enum のケースをデフォルトで印刷することができます。 print(_:) に変換するか、または String を使って String 's init(_:) 初期化子、または文字列補間構文を使用します。ですから、あなたの例では

enum City: Int {
    case Melbourne = 1, Chelyabinsk, Bursa
}
let city = City.Melbourne

print(city)
// prints "Melbourne"

let cityName = "\(city)"   // or `let cityName = String(city)`
// cityName contains "Melbourne"

そのため、もはや & を定義する必要はありません。それぞれのケースで切り替えて文字列リテラルを返す便利な関数を維持します。さらに、これは、生の値の型が指定されていない場合でも、あらゆるenumに対して自動的に動作します。

debugPrint(_:) &です。 String(reflecting:) は、完全修飾名に使用することができます。

debugPrint(city)
// prints "App.City.Melbourne" (or similar, depending on the full scope)

let cityDebugName = String(reflecting: city)
// cityDebugName contains "App.City.Melbourne"

これらのシナリオのそれぞれで印刷される内容をカスタマイズできることに注意してください。

extension City: CustomStringConvertible {
    var description: String {
        return "City \(rawValue)"
    }
}

print(city)
// prints "City 1"

extension City: CustomDebugStringConvertible {
    var debugDescription: String {
        return "City (rawValue: \(rawValue))"
    }
}

debugPrint(city)
// prints "City (rawValue: 1)"

(この "default" 値を呼び出して、例えば、switch 文に頼らずに "The city is Melbourne" と表示する方法は見つかっていません。使用方法 \(self) の実装では description / debugDescription は無限回想を引き起こす)



上記のコメント String 's init(_:) & init(reflecting:) 初期化子は、反映された型が何に準拠するかによって、表示される内容を正確に記述します。

extension String {
    /// Initialize `self` with the textual representation of `instance`.
    ///
    /// * If `T` conforms to `Streamable`, the result is obtained by
    ///   calling `instance.writeTo(s)` on an empty string s.
    /// * Otherwise, if `T` conforms to `CustomStringConvertible`, the
    ///   result is `instance`'s `description`
    /// * Otherwise, if `T` conforms to `CustomDebugStringConvertible`,
    ///   the result is `instance`'s `debugDescription`
    /// * Otherwise, an unspecified result is supplied automatically by
    ///   the Swift standard library.
    ///
    /// - SeeAlso: `String.init<T>(reflecting: T)`
    public init<T>(_ instance: T)

    /// Initialize `self` with a detailed textual representation of
    /// `subject`, suitable for debugging.
    ///
    /// * If `T` conforms to `CustomDebugStringConvertible`, the result
    ///   is `subject`'s `debugDescription`.
    ///
    /// * Otherwise, if `T` conforms to `CustomStringConvertible`, the result
    ///   is `subject`'s `description`.
    ///
    /// * Otherwise, if `T` conforms to `Streamable`, the result is
    ///   obtained by calling `subject.writeTo(s)` on an empty string s.
    ///
    /// * Otherwise, an unspecified result is supplied automatically by
    ///   the Swift standard library.
    ///
    /// - SeeAlso: `String.init<T>(T)`
    public init<T>(reflecting subject: T)
}



をご覧ください。 リリースノート は、この変更についての情報です。