Я пытаюсь использовать одно и то же представление как для 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'
Разве они не оба стили списка?
Оба они являются стилями списка, но имеют разные конкретные типы, поэтому быстрая проверка типов не позволяет этого, вместо этого мы можем использовать пользовательский модификатор, например
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)