我从另一个开发人员那里继承了一个Swift项目。我们正在添加一个imageUrl,它现在可以成为
从JSON api返回。我们正在退回使用阿拉莫菲尔。
一个问题是我们的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)
  }
}

最佳答案

是的,imageUrl将是一个可选字符串,因为它可能存在,或者可能不存在于JSON数据中。一点-您当前的imageUrl模型初始值设定项代码为:

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

就我个人而言,我认为它会更干净,因为:
let imageUrl = data["instore_image_url_200w"] as? String

至于第二个问题,如果您进行了如上所述的初始化,那么nil值将在初始化期间自动处理,因为imageUrl值是可选的,因此它要么被设置为nil(对于nil值),要么具有实际的字符串值。
当然,当您使用imageUrl时,您总是需要检查它是否为零或是否有值,但您已经提到您将在显示时执行此操作。

关于json - 如何在便捷初始化程序中的Swift中检查JSON nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42915989/

10-12 06:28