Получить Enum Publisher с Combine - PullRequest
0 голосов
/ 02 мая 2020

Как я могу получить Publisher для значения перечисления в Combine?

Я хочу получать уведомление, когда свойство enum обновляется, чтобы обработать значение с использованием объединения и создать новый Publisher для разработанного значения.

Я создал рабочий пример того, что я хочу, используя жестко закодированные строки для тегов и сотрудничества. что вы можете найти здесь https://gist.github.com/alessionossa/543a18a55423d98fc415be9edebbddb5. В этом примере я могу просто использовать highlightedPanel без кода Combine, но в моем реальном проекте есть более сложный лог c, требующий использования Combine. Теперь я хочу выполнить sh, используя перечисления для идентификации NavigationLinks.

Вот пример кода:

1 Ответ

1 голос
/ 02 мая 2020

Как насчёт того, чтобы сделать мир проще, как показано ниже ...

enum SectionPane: Equatable, Identifiable, CustomStringConvertible {

    case servers
    case snippets

    var description: String {
        switch self {
        case .servers:
            return "server"
        case .snippets:
            return "snippet"
        }
    }

    var id: SectionPane { self }
}

class SectionPaneViewModel: ObservableObject {
    @Published var highlightedPane: SectionPane? = nil
    @Published var selectedPane: SectionPane? = nil
}

struct TestEnumPublisher: View {
    @ObservedObject var vm = SectionPaneViewModel()

    @State private var active: String = ""

    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                // Current selection label
                Text("Selected: \(active)")

                NavigationLink(destination: Text("first view").onAppear{ self.vm.highlightedPane = .servers },
                            tag: SectionPane.servers, selection: $vm.selectedPane) {
                    Text("First")
                }
                NavigationLink(destination: Text("second view").onAppear{ self.vm.highlightedPane = .snippets },
                            tag: SectionPane.snippets, selection: $vm.selectedPane) {
                    Text("Second")
                }

                Spacer()
            }.onReceive(vm.$selectedPane, perform: { selection in
                self.active = selection?.description ?? "none"
            })
        }
    }
}
...