我想根据稍后来自后端的值渲染两个不同的HStack
let list: [ReminderModel] = [ReminderModel(text: "Buy Bananas", closed: true), ReminderModel(text: "Meet John", closed: false), ReminderModel(text: "MMhh", closed: false), ReminderModel(text: "4", closed: false), ReminderModel(text: "5", closed: false), ReminderModel(text: "6", closed: false)]
var current: Int = 0
struct ReminderList: View {
var body: some View {
VStack() {
list.count%3 == 2 ?
HStack() {
Reminder(closed: list[list.count-2].closed, text: list[list.count-2].text)
Reminder(closed: list[list.count-1].closed, text: list[list.count-1].text)
}
: //Here is the error
HStack() {
Reminder(closed: list[list.count-1].closed, text: list[list.count-1].text)
}
}
}
}
错误:
“?”中的结果值:'表达式的类型不匹配
HStack<TupleView<(Reminder, Reminder)>>
和HStack<Reminder>
答案 0 :(得分:1)
如您所见,这两个表达式产生不同的类型。与以下情况相同:
backend
let x = someCondition ? 1 : "abc"
是x
还是Int
? Swift具有静态类型系统,因此所有变量必须都具有在编译时已知的类型。然而,取决于String
的值,直到运行时才知道这里的类型。在这种情况下,必须将类型设置为两种类型的超类型(协议或超类)。在这种情况下,一个示例超级类型是someCondition()
。另一个可能的是CustomStringConvertible
。
在这种情况下,可以使用类型擦除器AnyView
来包装两个参数,以提供一致的类型Any
。
一个更好的解决方案是使用if-else块。与条件运算符不同,SwiftUI视图功能构建器会将其转换为能够处理不同视图的结构。
AnyView