我正在try 创建一些我认为是简单的代码来显示字典项的键,并实现Stepper或Picker来修改窗体视图中一行中的键的值.

最后,我要做的就是向用户显示他们输入的单词列表,以及他们可以更改的相关数值.

几乎每一种解决问题的方法都会彻底炸毁我的画布,因为很明显,我试图解决这个问题的try 是错误的.

无论如何,下面是我一直在try 解决问题的一些方法的例子.请注意,我还try 了许多类型的视图,比如带有单词的文本和关联的Integer的选取器.我只是想,为了演示这个问题,对每个示例使用Stepper可能就足够好了.

struct Likenesses {
    let word: String
    var likeness: Int = 0
}

struct ContentView: View {
    
    @State private var words: [String] = []
    @State private var likeness: [Int] = []
    @State private var wordLikeness: [String:Int] = [:]
    @State private var StructLikeness: [Likenesses] = []
    
    var body: some View {
        Form {
            
            // Dict Method
            Section {
                ForEach(Array(wordLikeness.keys), id: \.self) { key in
                    Stepper("\(key)", value: $wordLikeness[key], in: 0...8, step: 1)
                }
            }
            
            // Arrays method
            Section {
                ForEach(0...words.count, id: \.self) { i in
                    Stepper("\(word[i])", value: $likeness[i], in: 0...8, step: 1)
                }
            }
            
            // Struct method
            Section {
                ForEach(StructLikeness, id: \.self) { s in
                    /*
                    Yes, I know structs are not references and pass copies around, this was another issue I was going to have to solve eventually, but for now, this gets the idea of what I was trying to solve with a struct
                    */
                    Stepper("\(s.word)", value: $s.likeness, in: 0...8, step: 1)
                }
            }
        }
    }
}

推荐答案

字典元素没有特定的顺序,因此在ForEach中使用它们之前,您需要首先确定顺序.例如,如果要按键排序,

@State private var likenesses: [String: Int] = ["Foo": 3]
Form {
    Section {
        ForEach(likenesses.keys.sorted(), id: \.self) { key in
            Stepper("\(key): \(likenesses[key]!)", value: Binding($likenesses[key])!, in: 0...8, step: 1)
        }
    }
}

我更喜欢传递一个 struct array.创建ForEach时创建绑定,而不是在创建步进器时创建绑定.

@State private var likenesses: [Likenesses] = [...]
Form {
    Section {
        ForEach($likenesses) { s in
            Stepper("\(s.wrappedValue.word): \(s.wrappedValue.likeness)", value: s.likeness, in: 0...8, step: 1)
        }
    }
}

请注意,该 struct 应符合Identifiable:

struct Likenesses: Identifiable {
    let word: String
    var likeness: Int = 0
    
    // here I'm using word as the id
    var id: String { word }
}

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

如何访问用户选定目录下的(只读)文件?

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

将`@Environment`值赋给`Binding`参数

文件命名&NumberForMatter+扩展名&:含义?

可以';t在标记为@Observable的类上使用属性包装

如何使用Duration.TimeFormatStyle以h m s格式快速格式化时间

如何通过 Enum 属性使用新的 #Predicate 宏获取

使第二个视图变灰 SwiftUI

ScreenCaptureKit/CVPixelBuffer 格式产生意外结果

从 actor 的 init 方法调用方法

为 ObservedObject 和 State 对象配置预览

签署GoogleSignIn-GoogleSignIn需要开发团队

如何在 SwiftUI 中获取视图的位置

Swift:创建用于调用 C 函数的指针数组

无法分配给属性:absoluteString是一个只能获取的属性

iOS Swift - 如何更改表格视图的背景 colored颜色 ?

如何删除桥头而不出错?

FirebaseStorage:如何删除目录

判断用户是否登录到 iCloud?Swift /iOS