ios - SwiftUI 允许 Struct 中的所有字符串枚举
问题描述
这可能是一个愚蠢的问题,但我试图允许所有字符串枚举作为 Struct 中变量的类型。下面的代码是完全错误的,但我希望它能让我的问题更清楚。
我的想法是使所有枚举符合相同的协议,但我无法使用这种方法访问 .allCases 。
我的目标是我可以将任何字符串枚举传递给 ListView,然后它将显示枚举的所有组件(这里:一;二;三)。
有谁知道如何做到这一点?它一定是一个非常基本的 Swift 东西,但我无法通过网络搜索找到它。太感谢了!
import SwiftUI
struct ContentView: View {
var body: some View {
ListView(myEnum: Elements.self) //error here as well
}
}
protocol StringRepresentable {
var rawValue: String { get }
}
enum Elements: String, Equatable, CaseIterable, StringRepresentable {
case one
case two
case three
}
struct ListView: View {
let myEnum: StringRepresentable //doesn't work
var body: some View {
ForEach(myEnum.allCases, id: \.self) { elem in //can't access .allCases
Text(elem.rawValue)
}
}
}
解决方案
您的原始代码中有几个错误。首先,您没有使用VStack
(or List
or LazyVStack
),因此您的 foreach 只会呈现一个元素。
其次,您将类型而不是元素本身传递给列表视图。最后,您自己的StringRepresentable
协议是不必要的,您可以使用RawRepresentable
它的关联类型RawValue
限制为String
即是这样的:
struct ContentView: View {
var body: some View {
VStack {
ListView(values: Fruits.allCases)
ListView(values: Animals.allCases)
}
}
}
enum Fruits: String, CaseIterable {
case apple
case orange
case banana
}
enum Animals: String, CaseIterable {
case cat
case dog
case elephant
}
struct ListView<T: RawRepresentable & Hashable>: View where T.RawValue == String {
let values: [T]
var body: some View {
LazyVStack {
ForEach(values, id: \.self) { elem in
Text(elem.rawValue)
}
}
}
}
像这样呈现
推荐阅读
- php - PHP:无法延长函数的执行时间
- cassandra - 如何一起使用 Cassandra 和 Ignite 对数据进行建模?
- redis - Redis 中的跨集群复制
- python - 压缩多个列表会导致 python 2.7 中的性能问题吗?
- c - 由于内存未释放,LWIP 在一段时间后挂起
- python - 如何在同一张图上绘制来自不同模型的多条学习曲线?
- regex - 如何使用正则表达式提取器从响应标头中提取元素
- mysql - 如何在另一台主机上将 kafka 与 MySQL 连接?
- c++ - 将数组传递给函数的大小控制
- java - java - 如何修复Java maven项目中的“目标org.owasp:dependency-check-maven:4.0.2:聚合失败。:NullPointerException的执行默认值”?