无法在swift中调用类型为'Object'的初始值设定项

时间:2015-05-25 20:55:44

标签: json swift alamofire

使用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]
    }
}

1 个答案:

答案 0 :(得分:2)

由于jsonObj的类型为[String: AnyObject],当您尝试对其进行迭代时,dictionary的类型为(String, AnyObject),代表键和值字典。这就是为什么Swift无法实例化您的Object,因为它需要Dictionary而不是Tuple

您应该将jsonObj实例化为[[String: AnyObject]]

一些额外的评论:

  1. 恰当地命名变量,object听起来像一个Object,但实际上是一个对象数组。将其更改为objects: [Object]

  2. 您可以选择在var jsonObj = json as? [String: AnyObject]中向下转发,但之后您会强制解包此变量。要么使用as!强制转换它,要么使用if let语句来捕获任何nil值。

  3. 使用map包装初始值,而不是循环遍历数组的值。

  4. 所以你的代码变成了:

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

    (或类似的东西,我不知道那里做了什么)