Связанное состояние перечисления в SwiftUI

Как я могу использовать связанное перечисление в качестве @State переменная в if заявление в SwiftUI?

struct ProfileView: View {
    @State private var choice = Choice.simple

    private enum Choice {
        case simple
        case associated(Int)
    }

    var body: some View {
        if choice == .simple {
            Text("Simple")
        }
    }
}

Компилятор сообщает об этой ошибке:

Протокол Equatable требует, чтобы ProfileView.Choice соответствовал Equatable.

2 ответа

Решение

Вот фиксированный вариант. Протестировано с Xcode 11.4.

struct ProfileView: View {
    @State private var choice = Choice.simple

    private enum Choice: Equatable {
        case simple
        case associated(Int)
    }

    var body: some View {
        Group {
            if choice == .simple {
                Text("Simple")
            } else {
                Text("Other")
            }
        }
    }
}

Вам нужно использовать if case проверить, есть ли enum переменная соответствует определенному case.

var body: some View {
    if case .simple = choice {
        return Text("Simple")
    } else {
        return Text("Not so simple")
    }
}

Если вы действительно хотите использовать связанное значение для отображения, я бы предложил использовать switch покрыть все enum случаи.

var body: some View {
    let text: String
    switch choice {
    case .simple:
        text = "Simple"
    case .associated(let value):
        text = "\(value)"
    }
    return Text(text)
}
Другие вопросы по тегам