如何在 Swift 中从我的数据库生成状态变量?



我的解决方案要求我对占位符状态变量进行硬编码field_1field_2然后通过数组动态传递给我的TextField。

如何更动态地实现这一目标?我想将任意 Firestore 文档从我的数据库映射到匹配任意文本字段。我使用它来生成一个因用户而异的设置屏幕。

这是我目前的解决方案,上面引用:

import SwiftUI
struct ParentView: View {
var data = [
["field": "Account Number", "title": "Account Number"],
["field": "Account Number", "title": "Account Number"]
]
@State var settings: [Dictionary<String,Any>] = []
var fields: [Binding<String>] = []
@State var field_1: String = "1"
@State var field_2: String = "2"
init(){
self.fields.append(self.$field_1)
self.fields.append(self.$field_2)
}
func getSettingsObjects() { for item in data { settings.append(item)}}
var body: some View {
VStack {
ForEach(self.$settings.wrappedValue.indices, id: .self) { i in
TextField(self.settings[i]["title"] as! String, text: self.fields[i])
}
}
.padding(.all,20)
.navigationBarTitle("Settings")
.onAppear {
_ = self.getSettingsObjects()
}
}
}

为了处理火碱字段,我喜欢设置一个全局结构。然后,每次都可以使用变量 DatabaseField.field1 代替变量 DatabaseField.field1,而不是键入字符串。

struct DatabaseField { //Titles for fields in database
static let field1 = "field_one_title"
static let field2 = "field_two_title"
}

在这里,您可以通过调用

...
let field: String = DatabaseField.field1

另外,您还可以创建一个全局枚举来处理字符串类型的原始值的状态、项目等。如果状态要像布尔一样在您的视图控制器中工作,我会使用它。

enum FieldState: String { //ViewController states can be used in functions
case field1 = "field_one_title"
case field2 = "field_two_title"
}

在这里,您可以将变量设置为此新类型...

var currentState: FieldState = .field1

您可以使用以下命令访问此类型的字符串值...

let currentField: String = currentState.rawValue

正如您已经意识到的那样,您应该尽可能避免硬编码变量字符串和数据库字段名称。我通常会制作一个单独的 Swift 文件,并将我项目的所有全局结构体或枚举存储在那里。这样,您可以对其进行一次硬编码,而不必再碰它。如果您必须更改字段标题,您只需要在结构/枚举中更改它!旁注:您的项目可能包含多个结构体和枚举。如果是这种情况,尽量不要为同一字段/字符串同时制作结构/枚举,否则可能会混淆破译哪个是哪个。

最新更新