如何从构建失败中纠正此代码?基本上想使用ForEach遍历基于[customEnum:customStrut]的字典。
否则,如果这有问题,SwiftUI支持的另一种实现方式是否可行?
错误
在'ForEach'上引用初始化程序'init(_:id:content :)'需要 那个'[GCFilterViewOptions.FilterOptions: GCFilterViewOptions.FilterOptionValues]'符合 “ RandomAccessCollection”
输入'(键:GCFilterViewOptions.FilterOptions,值: GCFilterViewOptions.FilterOptionValues)'不符合'Hashable'; 只有struct / enum / class类型可以符合协议
代码
import SwiftUI
struct GCFilterViewOptions: View {
enum FilterOptions {
case NewLine
case Comma
case Space
}
struct FilterOptionValues {
var title : String
var selected : Bool
}
var filterSelections : [FilterOptions : FilterOptionValues] = [
FilterOptions.NewLine : FilterOptionValues(title: "New Line", selected: true),
FilterOptions.Comma : FilterOptionValues(title: "Comma", selected: true),
FilterOptions.Space : FilterOptionValues(title: "Space", selected: false)
]
var body : some View {
HStack {
ForEach(filterSelections, id:\.self) { filterOption in. // ** ERRORS HERE **
Text("TBD")
// Will be putting checkboxes here - i.e. so can chose which ones
}
}
}
}
答案 0 :(得分:1)
由于状态字典不是具有“随机访问”功能的集合,因此不能直接在ForEach中使用,这是可行的方法
HStack {
ForEach(Array(filterSelections.keys.enumerated()), id:\.element) { _, key in
Text("TBD \(self.filterSelections[key]?.title ?? "")")
// Will be putting checkboxes here - i.e. so can chose which ones
}
}
答案 1 :(得分:0)
ForEach循环仅支持具有RandomAccess功能的数据结构(Apple的有关RandomAccessCollection的优点的文档)。
如果您实际上不需要字典结构,则可以使用简单的结构。这与您的基本相同,但是枚举嵌套在其中,并且是一个属性:
struct FilterOption {
enum FilterOptionType {
case newLine
case comma
case space
}
var type: FilterOptionType
var title: String
var selected: Bool
}
var filterSelection: [FilterOption] = [
FilterOption(type: .newLine, title: "New line", selected: true),
FilterOption(type: .comma, title: "Comma", selected: false),
FilterOption(type: .space, title: "Space", selected: true),
]
如果要使用词典(例如断言选项仅列出一次),则应保留当前的数据结构,仅使用词典键即可访问元素。请记住,字典不是有序的,如果您想要稳定的顺序,则应该对它进行排序(例如,使用键的rawValue进行排序):
enum FilterOption: String {
case newLine
case comma
case space
}
struct FilterOptionValue {
var title: String
var selected: Bool
}
var filterSelection: [FilterOption: FilterOptionValue] = [
.newLine: FilterOptionValue(title: "New Line", selected: true),
.comma: FilterOptionValue(title: "Comma", selected: true),
.space: FilterOptionValue(title: "Space", selected: false)
]
// Guarantees a stable print order
for option in filterSelection.keys.sorted(by: { $0.rawValue < $1.rawValue }) {
let optionValue = filterSelection[key]!
print(option, optionValue)
}
请注意,在Swift枚举中,属性都是小写的。只有类型以大写字母(newLine
而非NewLine
)开头。
此外,枚举类型名称应为单数,因为在实例化时它们仅表示单个选项。使用FilterOption
代替FilterOptions
。
与filterSelections
相同,应该是单数形式,因为选择内容已经包含多个元素。