gpt4 book ai didi

ios - SwiftUI:可以为各种形状协议(protocol)管理单个结构吗?

转载 作者:行者123 更新时间:2023-12-01 16:05:13 24 4
gpt4 key购买 nike

目标:
使用单个结构来管理自定义 View 的外观和行为.
状态:
我有一个简单的 View 模型,它维护代 TableView 的数据数组。在运行时,我将这些 View 绘制如下:

struct MyView: View {
@ObservedObject var viewModel = MyViewModel()

var body: some View {
Vstack() {
ForEach(viewModel.data, id: \.id) { data in
switch data.shape {
case .circle:
MyViewCircle(isHighlighted: data.willHighlight)
case .ellipses:
MyViewEllipses(isHighlighted: data.willHighlight)
}
}
}
}
}

struct MyViewCircle: View {
var isHighlighted: Bool

var body: some View {
Circle()
/// a bunch of modifiers
}
}

struct MyViewEllipses: View {
var isHighlighted: Bool

var body: some View {
Ellipses()
///A bunch of modifiers that mirror exactly MyViewCircle
}
}
这工作正常,我可以更新我的 viewModel,这将相应地更新我的 View 。
My Shapes drawing, I can even tap on the view and update my view model and highlight the corresponding shapes (code not shown for brevity
但是,就我而言, MyViewCircleMyViewEllipses将具有完全相同的外观和行为,唯一不同的是它的形状,我还计划添加许多其他形状甚至自定义绘制的形状。
我想做的
我希望能够通过 enumprotocol或者在我的 ForEach 循环中绘制我想要的形状并简化而不需要长的 switch 语句的东西。像这样的东西:
struct MyView: View {
@ObservedObject var viewModel = MyViewModel()

var body: some View {
VStack() {
ForEach(viewModel.data, id: \.id) { data in
MyViewProtocol(shape: data.shape, isHighlighted: data.IsHighlighted)
}
}
}
}
以及父类、父类(super class)、协议(protocol),无论 MyViewProtocol 的正确名称是什么看起来像:
struct MyViewProtocol: View {
var shape: ShapeEnum
var isHighlighted: Bool

var body: some View {
switch shape:
case .circle:
Circle()
case .ellipses:
Ellipses()
case .triangle:
MyTrinagle()
// etc.....
}
}
我一直在搜索任何/所有 WWDC 演讲、YouTube 教程、媒体文章,我能找到的最接近的内容是在这里: Creating BaseView class in SwiftUI这对于创建一组 View 修改器很有用,但是如果我希望能够使用由一个父结构 View 管理的大量形状,我仍然处于困境中。
我也可能遇到问题,因为对于像 SwiftUI 这样的声明性语言来说,这可能是一个危险的错误设计模式!
我将非常感谢任何提示或想法!

最佳答案

我认为您不能避免使用 switch 语句,因为您需要 ShapeEnum 之间的映射。案例和实际 View ,但您可以将其集中在一个地方:

enum ShapeEnum {
case circle, ellipse, square // etc...
}
extension ShapeEnum: View {
var body: AnyView {
switch self {
case circle: return AnyView(Circle())
case ellipse: return AnyView(Ellipse())
// ...
default: return AnyView(EmptyView())
}
}
}
用法可能是:
@State var shapes: [ShapeEnum] = [.circle, .circle, .ellipse]

var body: some View {
ForEach(shapes, id: \.self) { shape in
shape
.padding()
.background(Color.red)
}
}

关于ios - SwiftUI:可以为各种形状协议(protocol)管理单个结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63093327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com