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