为什么不能在 SwiftUI 视图中循环访问枚举数据?



假设我有一个enum,Channel,填充了示例属性数据:

enum Channel: CaseIterable {
case abc
case efg
case hij

var name: String {
switch self {
case .abc:  return "ABC"
case .efg:  return "EFG"
case .hij:  return "HIJ"
}
}
}
extension Channel: Identifiable {
var id: Self { self }
}

和一些视图实现来填充所述内容:

struct ChannelHome: View {
var body: some View {
VStack {
ForEach(Channel.allCases) { channel in
NavigationLink(destination: ChannelDetail(channel)) {
Text(channel.name)
}
}
}
}
}   // big closure yikes

为什么这个不行?这是由于枚举没有静态属性和SwiftUI是声明性的性质吗?有办法解决这个问题吗?如:

struct ChannelData {
static let channels: [Channel] = [.abc, .efg, .hij]
// or
static func getChannels() -> [Channel] {
var channelArray: [Channel]
for channel in Channel.allCases {
channelArray.append(channel)
}
return channelArray
}
}

或者,更多的最好是,在SwiftUI视图中是否有更好的实践来呈现像这样的小数据集?我喜欢能够实现我的属性的可视化UI,当我调试,作为一个整体,在运行时(更接近生产阶段)。

我提前为这个问题道歉,我刚刚开始使用SwiftUI。

这里有2个简单的方法,但不确定在哪里可以帮助你,因为枚举你不能更新ForEach元素,但它有一个显示数据的用例!

没有任何可识别id的第一种方式:

struct ContentView: View {        
var body: some View {            
ForEach(TestEnum.allCases, id: .rawValue) { item in                 
Text(item.rawValue)                
}
}        
}
enum TestEnum: String, CaseIterable { case a, b, c }

具有符合可识别协议的可识别id,您甚至可以切断, id: .id:

struct ContentView: View {
var body: some View {
ForEach(TestEnum.allCases, id: .id) { item in
Text(item.rawValue)
}
}
}
enum TestEnum: String, CaseIterable, Identifiable { case a, b, c
var id: String { return self.rawValue }
}

要么Xcode是挂在缓存错误或我是一个傻瓜(可能是后者)。无论如何,这个问题似乎已经解决了以下可识别扩展到你的枚举,以及一个很好的旧的派生数据清除和清理:

extension Channel: Identifiable {
var id: Self { self }
}

我似乎把这个问题与另一个我经常遇到的长期问题混淆了;主要是关于枚举和它们对存储静态数据的厌恶(这只是它们快速和精简结构的本质)。

相关内容

  • 没有找到相关文章

最新更新