【发布时间】:2021-01-25 21:59:22
【问题描述】:
我正在努力解决一个问题,我认为(希望)有一个简单的解决方法,您可以提供帮助。
我正在尝试对多个变量运行ForEach 循环。为了简单起见,我只包含了两个变量,但还有更多变量,因此我想使用ForEach 循环而不是为每个变量重复相同的代码。每个变量都基于不同的枚举。
预期结果
我想在我的代码中运行一个 ForEach 循环,该循环遍历一个变量数组并提取变量的描述和相关的 rawValue。
变量
var profileEyeColor: EyeColor = EyeColor()
var profileHairColor: HairColor = HairColor()
枚举
enum EyeColor: String, CaseIterable {
case notSet
case amber
case blue
case brown
case gray
case green
case hazel
case other
case witheld
var description: String {
"Eye Color"
}
init() {
self = .notSet
}
}
enum HairColor: String, CaseIterable {
case notSet
case black
case blond
case brown
case auburn
case red
case gray
case white
case other
case witheld
var description: String {
"Hair Color"
}
init() {
self = .notSet
}
}
ForEach 循环
ForEach([profileEyeColor, profileHairColor], id: \.self) { item in
if item != .notSet && item != .witheld {
print(item.description)
print(item.rawValue)
}
}
实际结果
构建失败,xCode 错误包括:
- 无法将“profileHairColor”类型的值转换为预期的元素类型“EyeColor”
尝试了替代方法
我尝试使用for 循环而不是ForEach 来运行。我正在使用 SwiftUI,因此无法在正文中实现 for 循环。
我也试过把它拆分成一个单独的函数,但是函数出错了。
func profileDetailsLoop(data: [Any]) -> View {
ForEach(data, id: \.self) { item in
if item != .notSet && item != .witheld {
HStack {
Text(item.description)
Text(item.rawValue)
}
}
}
错误:协议类型'Any'的值不能符合'Hashable';只有结构/枚举/类类型可以符合协议
如果我将 [Any] 替换为 [enum],则会收到以下错误:预期的元素类型
如果我将 [Any] 替换为任何特定的枚举类型,例如 [EyeColor],这将不起作用(并且可能也不适用于不同的枚举类型)。
【问题讨论】:
-
所有枚举都是一样的还是只是巧合?
-
巧合(尽管即使上面的两个枚举也有不同的情况),因为示例中的两个是头发/眼睛的颜色。其他枚举包括状态、偏好、可见性等......
标签: swift for-loop foreach enums swiftui