如何使用名称作为字符串访问变量
How to access a variable using its name as a string
我正在考虑使用 plist 文件来配置我将表单上传到我的服务器的方式,但后来我意识到我不知道如何做这件事的一个关键部分,或者即使这是可能的,因为你不能用 swift.
动态声明变量
基本上我在考虑使用这样的字典
形式:
- property_name: backend_name
然后在我的表单上传方法中,我会做一些看起来像这样的事情
formValues: [String:String] = [:]
form.forEach { (property_name, backend_name) in
let value = someController[property_name] // to do the equivalent of someController.property_name
formValues[backend_name] = value
}
// ...
formValues.forEach { (backend_name, value) in
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: backend_name)
}
问题是我不知道这部分怎么做
let value = someController[property_name]
您要解决的问题是为服务器序列化数据。我不知道你尝试的方法是否可能 in Swift,但它肯定不是正确的方法。如果您使用 Swift 4,您可以创建 Codable
模型对象,因此此序列化将全部在幕后进行。否则,您很可能需要手动创建此 [String: Any]
。
我找到了方法。
formValues: [String:String] = [:]
form.forEach { (property_name, backend_name) in
let value = Mirror(reflecting: someController).children.filter({ (child) -> Bool in
return child.label == property_name
}).first!.value as! String
formValues[backend_name] = value
}
// ...
formValues.forEach { (backend_name, value) in
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: backend_name)
}
我知道这是未优化的,因为我每个周期都重新创建一个镜像,但这是为了演示目的
我正在考虑使用 plist 文件来配置我将表单上传到我的服务器的方式,但后来我意识到我不知道如何做这件事的一个关键部分,或者即使这是可能的,因为你不能用 swift.
动态声明变量基本上我在考虑使用这样的字典
形式:
- property_name: backend_name
然后在我的表单上传方法中,我会做一些看起来像这样的事情
formValues: [String:String] = [:]
form.forEach { (property_name, backend_name) in
let value = someController[property_name] // to do the equivalent of someController.property_name
formValues[backend_name] = value
}
// ...
formValues.forEach { (backend_name, value) in
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: backend_name)
}
问题是我不知道这部分怎么做
let value = someController[property_name]
您要解决的问题是为服务器序列化数据。我不知道你尝试的方法是否可能 in Swift,但它肯定不是正确的方法。如果您使用 Swift 4,您可以创建 Codable
模型对象,因此此序列化将全部在幕后进行。否则,您很可能需要手动创建此 [String: Any]
。
我找到了方法。
formValues: [String:String] = [:]
form.forEach { (property_name, backend_name) in
let value = Mirror(reflecting: someController).children.filter({ (child) -> Bool in
return child.label == property_name
}).first!.value as! String
formValues[backend_name] = value
}
// ...
formValues.forEach { (backend_name, value) in
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: backend_name)
}
我知道这是未优化的,因为我每个周期都重新创建一个镜像,但这是为了演示目的