![](/img/trans.png)
[英]Using protocol in SwiftUI for providing "some View" / Generics?
[英]Using protocol to capture SwiftUI view
我正在尝试编写一个协议,该协议要求conformers 有一个View 属性,或者一个返回一些View 的@ViewBuilder 方法。
我想要一个可重复使用的复合视图,可以根据需要显示的数据类型构建不同的子视图。
协议看起来像这样……
protocol RowView {
var leftSide: some View { get }
var rightSide: some View { get }
}
这样我就可以这样称呼……
struct Example: RowView {
var id: Int
var leftSide: some View { … }
var rightSide: some View { … }
}
struct ContentView: View {
let rows: [RowView]
var body: some View {
VStack {
Foreach(rows, id: \.id) {
HStack {
$0.leftSide
$0.rightSide
}
}
}
}
}
您需要将协议更改为:
protocol RowView {
associatedtype LView: View
associatedtype RView: View
var leftSide: LView { get }
var rightSide: RView { get }
}
此外,在内容视图中使用具体的Example
类型而不是协议(您定义的协议根本没有id
):
let rows: [Example]
还! 您可以根据需要使RowView
可identifiable
,因此不再需要id: \.id
:
protocol RowView: Identifiable
protocol RowView: Identifiable {
associatedtype LView: View
associatedtype RView: View
var leftSide: LView { get }
var rightSide: RView { get }
}
struct Example: RowView {
var id: Int
var leftSide: some View { Text("Left") }
var rightSide: some View { Text("Right") }
}
struct ContentView: View {
let rows: [Example] = [
.init(id: 1),
.init(id: 2)
]
var body: some View {
VStack {
ForEach(rows) { row in
HStack {
row.leftSide
row.rightSide
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.