SwiftUI ListStyle — результирующие значения в ‘? :’ имеют несовпадающие типы

#swiftui

#swiftui

Вопрос:

Я пытаюсь использовать одно и то же представление как для iOS, так и для macOS, изменяя только .ListStyle(), поскольку InsetGroupedListStyle() недоступен в macOS.

 @ViewBuilder
    var body: some View {
        if subject.tasks.count == 0 {
            
            VStack {
                Text("app.main.smartList.noTasks")
                Image(systemName: "tray.fill").font(.system(size: 90)).padding(40)
            }.navigationTitle("Empty")
            
        } else {
            
                List(subject.tasks, id: .id) { task in
                    TaskView(task: task).environmentObject(self.controller)
                }
                .listStyle(controller.currentOS == OS.iOS ? InsetGroupedListStyle() : DefaultListStyle())
                .navigationTitle(subject.name)
        }
    }
 

Но я продолжаю получать эту ошибку.

Результирующие значения в ‘? :’ espressione имеют несовпадающие типы ‘InsetGroupedListStyle’ и ‘DefaultListStyle’

Разве они не являются обоими стилями списка?

Ответ №1:

Это оба стиля списка, но разных конкретных типов, поэтому swift type checker не допускает такого, вместо этого мы можем использовать пользовательский модификатор, например

 extension List {
    @ViewBuilder
    func insetListStyle(if flag: Bool) -> some View {
        if flag {
            self.listStyle(InsetGroupedListStyle())
        } else {
            self     // implicit DefaultListStyle
        }
    }
}
 

и теперь используйте его как

 List(subject.tasks, id: .id) { task in
    TaskView(task: task).environmentObject(self.controller)
}
.insetListStyle(if: controller.currentOS == OS.iOS)