我创建了一个显示一堆卡片的视图。我向它传递两个参数:
struct CardStack: View {
var cards: [Card]
var content: (Int, Card) -> CardView
init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> CardView) {
self.cards = cards
self.content = content
}
var body: some View {
ZStack {
ForEach(Array(cards.enumerated()), id: \.element.id) { index, card in
content(index, card)
}
}
}
}
当闭包仅包含 CardView 时,它工作得很好,但是一旦我向 CardView 添加任何视图修饰符(并且我需要添加其中的许多视图修饰符),闭包的返回类型就会更改为
some View
,并且我得到错误:Cannot convert return expression of type 'some View' to return type 'CardView'
var deckBody: some View {
CardStack(cards: viewModel.cards) { index, card in // Error: Cannot convert return expression of type 'some View' to return type 'CardView'
CardView(card: card)
.zIndex(Double(index))
}
}
然后,当我修改 CardView 以期望闭包返回
any View
而不是 CardView
时,我收到另一个错误 Static method 'buildExpression' requires that 'Content' conform to 'AccessibilityRotorContent'
:
struct CardStack: View {
var cards: [Card]
var content: (Int, Card) -> any View
init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> any View) {
self.cards = cards
self.content = content
}
var body: some View {
ZStack {
ForEach(Array(cards.enumerated()), id: \.element.id) { index, card in
content(index, card) // Error: Static method 'buildExpression' requires that 'Content' conform to 'AccessibilityRotorContent'
}
}
}
}
我为什么要这样做,以及如何使闭包符合“AccessibilityRotorContent”?
CardStack
应该有一个通用类型参数,指示每张卡片显示的 View
的类型。
struct CardStack<CardContent: View>: View {
var cards: [Card]
var content: (Int, Card) -> CardContent
init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> CardContent) {
self.cards = cards
self.content = content
}
...
}