使用Swift和Alamofire,我正在尝试使用append方法转换Object中的单个json响应((字典:[String:AnyObject]))但是当我尝试它时,编译器无法抛出此错误:
<select class="form-control" ng-model="setting.port" ng- options="item.name group by item.type for item in filteredPorts(index) track by item.name" ng-change="updateAll(index)">
<option value="">-- Module Port --</option>
</select>
<div ng-if="setting.port.type == Analog">
<input type="text" name="min" placeholder="Min value" ng-model="setting.min">
<input type="text" name="max" placeholder="Max value" ng-model="setting.max">
</div>
我有什么想法可以解决它?
重要的是,getById函数的返回必须是[Object]?
json回复
cannot invoke initializer for type 'Object' with an argument list of type (dictionary:(String:AnyObject))
Optional(["name": object1, "_id": 5470def9e0c0be27780120d8,
"imageUrl": https://s3-eu-west-1.amazonaws.com/api-static/objects/5470def9e0c0b_180.png,
"location": {
city = Madrid;
country = Spain;
},
"desc": blablablabla.
])
class Object {
var id: String!
var name: String!
var imageUrl: String!
var location: [String: String]!
init(dictionary: [String: AnyObject]) {
id = dictionary["_id"] as? String
name = dictionary["name"] as? String
imageUrl = dictionary["imageUrl"] as? String
location = dictionary["location"] as? [String: String]
}
}
答案 0 :(得分:2)
由于jsonObj
的类型为[String: AnyObject]
,当您尝试对其进行迭代时,dictionary
的类型为(String, AnyObject)
,代表键和值字典。这就是为什么Swift无法实例化您的Object
,因为它需要Dictionary
而不是Tuple
。
您应该将jsonObj
实例化为[[String: AnyObject]]
。
一些额外的评论:
恰当地命名变量,object
听起来像一个Object
,但实际上是一个对象数组。将其更改为objects: [Object]
您可以选择在var jsonObj = json as? [String: AnyObject]
中向下转发,但之后您会强制解包此变量。要么使用as!
强制转换它,要么使用if let
语句来捕获任何nil
值。
使用map
包装初始值,而不是循环遍历数组的值。
所以你的代码变成了:
func getById(completionHandler: ([Object]?, NSError?) -> ()) {
Alamofire.request(Router.GetById("5470def9e0c0be27780121d7")).responseJSON { (request, response, json, error) in
if let objects = json as? [[String: AnyObject]] {
completionHandler(object.map {Object(dictionary: $0)}, nil)
return
}
completionHandler(nil, error)
}
(或类似的东西,我不知道那里做了什么)