如何在便捷初始化程序中检查Swift中的JSON nil

时间:2017-03-20 23:44:43

标签: json swift alamofire

我从另一个开发者那里继承了一个Swift项目。我们正在添加一个imageUrl,它现在可以成为项目的一部分 从JSON api返回。我们正在使用Alamofire。

一个问题是我们的instore_image_url_200w可以有一个空值 成为项目的imageUrl。我想我有两个问题。看起来我想将imageUrl作为可选字符串。它是否正确?如果是,那是什么 是在初始化期间处理nil值的正确方法吗?我想在item.imageUrl

上查看nil
  var items = [Item]()
  Alamofire.request(URL(string: "https://www.example.com/api/v1/metro_areas/1")!, method: .get).validate().responseJSON { (response) -> Void in
    guard let value = response.result.value as? [String: Any],
      let rows = value["items"] as? [[String: Any]] else {
        print("Malformed data received from fetchAllRooms service")
        return
    }
    for row in rows {
      let item = Item(data: row)
      if (item.imageUrl is String){
        print("here is item.imageUrl: \(item.imageUrl!)")
      }
      items.append(item)

    }
}

和模型:

class Item {
  var name: String
  var imageUrl: String?

  init(name: String, imageUrl: String) {

    self.name = name
    self.imageUrl = imageUrl
  }

  convenience init(data: [String:Any]) {
    let name = data["header"] as? String
    let imageUrl = data["instore_image_url_200w"] as! String?
    self.init(name: name!,
              imageUrl: imageUrl)
  }
}

1 个答案:

答案 0 :(得分:1)

是的,imageUrl是一个可选字符串,因为它可能存在,也可能不存在于JSON数据中。有一点 - 您目前将imageUrl的模型初始化代码作为:

let imageUrl = data["instore_image_url_200w"] as! String?

就我个人而言,我认为把它作为一个更清晰:

let imageUrl = data["instore_image_url_200w"] as? String

至于你的第二个问题,如果你有如上所述的初始化,那么nil值将在初始化期间自动处理,因为imageUrl值是可选的,因此它将被设置为nil(在零值上) )或者有一个实际的字符串值。

当然,当你使用imageUrl时,你总是要检查它是否为零或有值,但你已经提到你要在显示它。