为Alamofire参数创建复杂的[String:AnyObject]

时间:2015-11-01 23:25:41

标签: ios rest swift2 alamofire

这是我与Swift的第一个项目,所以请耐心等待。 我正在尝试使用Alamofire集成我的REST服务。在复杂的JSON结构的情况下,我在构建参数字段时遇到了一些麻烦。

服务器需要这样的结构:

{
  "event": {
    "name": "string",
    "duration": 1,
    "lat": 45.0,
    "lon": 45.0,
    "deadline": "2015-12-01T10:07:14.017Z"
  },
  "proposals": [
    "2015-11-01T10:07:14.017Z"
  ],
  "invitations": [
    {
      "user": 0,
      "phone": "string",
      "email": "string"
    }
  ]
}

其中proposal是一个NSDate数组,而invitations是一个Dictionary数组,两者都有可变长度。

目前,我正在尝试创建NSMutableDictionary,用必要的字段填充它,然后将其转换为[String: AnyObject]

这是事件和提案字段的示例:

var parameters: [String:AnyObject] = [
"event" : "",
"proposals": "",
"invitations": "",
]

if let event = mutableParameters.objectForKey("event") as? [String:AnyObject] {
parameters.updateValue(event, forKey: "event")
}

if let prop = mutableParameters.objectForKey("proposals") as? [String:AnyObject] {
parameters.updateValue(prop, forKey: "proposals")
}

但是第二个如果没有进入真正的分支。

有什么建议吗?如果有人有更好的解决方案,这将被广泛接受!

2 个答案:

答案 0 :(得分:2)

错误是您将mutableParameters.objectForKey("proposals")转换为[String:AnyObject]词典,但这应该是[String],一个字符串数组:

if let prop = mutableParameters.objectForKey("proposals") as? [String] {
    parameters.updateValue(prop, forKey: "proposals")
}

<强>更新

制作Swift词典并使用NSJSONSerialization

会更好
let source: [String:AnyObject] = ["event" : ["name": "welcome", "duration": "1", "lat": 45.0,"lon": 45.0,"deadline": "2015-12-01T10:07:14.017Z"], "proposals": ["2015-12-01T10:07:14.017Z"], "invitations": [["user": "eric", "phone": "555", "email": "none"]]]

do {
    let dictionaryAsJSONData = try NSJSONSerialization.dataWithJSONObject(source, options: [])
    // send it to your server, or...
    if let jsonDataAsString = NSString(data: dictionaryAsJSONData, encoding: NSUTF8StringEncoding) {
        // send this
        print(jsonDataAsString)
    }
} catch {
    print(error)
}

此处jsonDataAsString是:

  

{&#34;建议&#34;:[&#34; 2015-12-01T10:07:14.017Z&#34],&#34;邀请&#34;:[{&#34;电子邮件&# 34;:&#34;无&#34;&#34;使用者&#34;:&#34;埃里克&#34;&#34;电话&#34;:&#34; 555&#34;}], &#34;事件&#34; {&#34; LON&#34;:45,&#34;截止&#34;:&#34; 2015-12-01T10:07:14.017Z&#34;&# 34;持续时间&#34;:&#34; 1&#34;&#34; LAT&#34;:45,&#34;名称&#34;:&#34;欢迎&#34;}}

答案 1 :(得分:0)

Typical JSON handling is messy

使用SwiftyJSON

可以轻松实现此目的

通过Cocoapods或手动安装。对于手动,您只需在工作区中下载并添加SwiftyJSON.xcodeproj文件即可。

在Build Phases中为iOS添加SwiftyJSON框架

enter image description here

现在只需将其导入ViewController

即可
import SwiftyJSON

即使在导入后如果Xcode无法识别它。清理并构建它。

  

<强>代码

 let dic1 = ["name": "string", "duration": "1", "lat": 45.0,"lon": 45.0,"deadline": "2015-12-01T10:07:14.017Z"]
 let dic2 = ["2015-12-01T10:07:14.017Z"]
 let dic3 = [["user": "string", "phone": "1", "email": "asd"]]

 let response = [ "event" : dic1,"proposals": dic2,"invitations": dic3]
 print(JSON(response))
  

<强>输出

enter image description here