【问题标题】:Why can't one iterate through enum data within a SwiftUI view?为什么不能在 SwiftUI 视图中遍历枚举数据?
【发布时间】:2021-11-26 00:40:39
【问题描述】:

假设我有一些枚举,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 来解决这个问题。

【问题讨论】:

  • 究竟有什么不适合你?一切似乎在这里都很好(Xcode 13 / iOS 15)。也许您只是忘记将ChannelHome 的内容包装到NavigationView 以使链接正常工作?
  • 您的代码在 iOS 15 模拟器上的 Xcode 13 中为我工作。它在屏幕上显示字母。 (我删除了 NavigationLink,因为您没有提供 ChannelDetail
  • 顺便说一句,您的 getChannels 方法实际上并没有做任何事情。

标签: ios swift macos swiftui enums


【解决方案1】:

这里有 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 }

使用符合 Identifiable 协议的 Identifiable 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 }
    
}

【讨论】:

  • 这是奇怪的双倍行距,是故意的吗?
  • 空间!问题不在于空间!它是关于枚举和 ForEach 的!想想那些吧!
  • 这很好,但格式很奇怪。
  • 忘记格式!这个想法很重要
  • "忘记格式!"不用了,谢谢。这就是你交流想法的方式,这通常是瓶颈所在。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多