swift enum mirror получить имя связанного значения - PullRequest
0 голосов
/ 02 сентября 2018

Мне нужно получить имя, связанное с перечислением.

например:

enum App{
    case iOS(version:String)
    case android(version:String, build:Int)
}
let iosApp = App.iOS(version:"2.30.11")
let androidApp = App.android(version:"2.30.11",build:101)
let iosMirror = Mirror(reflecting: iosApp)
for case let (key?, value) in iosMirror.children {
        print("\(key)-\(value)") //this will print:iOS-2.30.11,missing the value name-"version",the string "version" was I need.
}
let androidMirror = Mirror(reflecting: androidApp)
for case let (key?, value) in androidMirror.children {
        print("\(key)-\(value)") //this will print:android-(version:"2.30.11",build:101)
}

вопрос: я хочу получить имя связанного значения "версия" iosApp от iosMirror , Как мне поступить? или используя другой способ (не Mirror), чтобы получить строки "version".

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

iOS- (версия: "2.30.11") android- (версия: "2.30.11", сборка: 101) получает напечатано с Xcode10 (Swift4.2), так что это ошибка старой версии.

- @ Назначение

Я тестировал этот код в Xcode 10-beta 6, он печатает iOS- (версия: «2.30.11»). этот вопрос решен.

спасибо @ Цель.

0 голосов
/ 02 сентября 2018

Не уверен, что это то, что вам нужно, но вы можете позволить своему enum реализовать CustomStringConvertible для получения определенного вывода.

enum App : CustomStringConvertible {
    var description: String { get {
        switch self {
            case .iOS(version: let v):
                return "version: \(v)"
            case .android(version: let v, build: let b):
                return "version: \(v) build: \(b)"
            }
        }
    }

    case iOS(version: String)
    case android(version:String, build:Int)
}

let iosApp = App.iOS(version:"2.30.11")
let androidApp = App.android(version:"2.30.11",build:101)

print(iosApp)
print(androidApp)
...