【问题标题】:How to access a variable using its name as a string如何使用变量名作为字符串访问变量
【发布时间】:2018-03-10 13:20:10
【问题描述】:

我正在考虑使用 plist 文件来配置如何将表单上传到我的服务器,但后来我意识到我不知道如何完成其​​中的一个关键部分,或者即使这是可能的,因为你可以' t 用 swift 动态声明变量。

基本上我在考虑使用这样的字典

表格:

  • 属性名称:后端名称

然后在我的表单上传方法中,我会做一些看起来像这样的事情

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]

【问题讨论】:

    标签: ios swift nsdictionary class-attributes


    【解决方案1】:

    您要解决的问题是为服务器序列化数据。我不知道您尝试的方法在 Swift 中是否可能,但它绝对不是正确的方法。如果你使用的是 Swift 4,你可以创建 Codable 模型对象,所以这个序列化将全部在后台。否则,您很可能需要手动创建此[String: Any]。

    Using Codable to serialize/deserialize objects

    【讨论】:

    • 所以你是说你不能动态访问一个类属性?可能出于同样的原因,您也无法动态创建类属性编辑:我正在使用 swift 3.2
    • 我不确定您是否可以通过KeyPaths 实现您想要的。他们还在 Swift 4 中进行了改进,因此它们更强大。另一件可能需要研究的事情。
    • 但是,总而言之,Swift 有一个强大的类型系统,并且喜欢知道所有事物的类型。会使这样的问题变得困难。
    • 我花了一些时间来标记答案,抱歉,完全忘记了,虽然我找到了我想象中的方法,但我选择序列化我的数据
    【解决方案2】:

    我发现了我该怎么做。

    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)
    }
    

    我知道这是未优化的,因为我在每个周期都重新创建了一个镜像,但它是出于演示目的

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多