Перечисление со связанным значением в качестве связанного значения другого перечисления (вложенное связанное значение) - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть enum Foo со связанным значением.Enum Foo служит ассоциированным значением другого перечисления Car.Я хотел бы знать, как получить доступ к «вложенному» связанному значению Foo, как показано в примере ниже:

enum Foo: Equatable {
    case moo
    case zoo(String)
}

enum Car {
     case mar
     case dar(Foo)
     case gar(Foo)
}

func request(with type: Car) -> String {
     switch type {
     case .mar:
         return "mar"
     case .dar(let foo) where foo == .moo:
         return "darmoo"
     case .dar(let foo) where foo == .zoo(let value):
     // how can I access the associated value of foo?
     // This where syntax results in an error - Consecutive statements on a line must be separated by ';'
    }
}

Ответы [ 2 ]

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

Вы можете использовать сопоставление с образцом:

switch type {
case .mar:
    return "mar"
case .dar(let foo) where foo == .moo:
    return "darmoo"
case .dar(.moo):
    return "dar: moo"
case let .dar(.zoo(value)):
    return "dar: \(value)"
case .gar:
    return "gar"
}

Или, если вы хотите обрабатывать Foo таким же образом для dar и gar, вы можете связать foo в одном случае:

switch type {
case .mar:
    return "mar"
case .dar(let foo) where foo == .moo:
    return "darmoo"
case let .dar(foo), let .gar(foo):
    switch foo {
    case .moo:
        return "moo"
    case let .zoo(value):
        return value
    }
}
0 голосов
/ 18 сентября 2018

Как вы правильно сказали, это гнездо.Так что гнездо!Используйте переключатель внутри переключателя.Это составляет:

func request(with type: Car) -> String {
    switch type {
    case .mar:
        return "mar"
    case .dar(let foo):
        switch foo {
        case .moo: return "darmoo"
        case .zoo(let s): return s
        }
    case .gar:
        return "gar"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...