我从另一个开发者那里继承了一个 Swift 项目。我们正在添加一个 imageUrl,它现在可以成为项目的一部分 从 JSON api 返回。我们正在退回使用的 Alamofire。
一个问题是我们的 instore_image_url_200w 可以有一个空值,它
成为项目的 imageUrl。我想我有两个问题。看起来我想让 imageUrl 成为可选字符串。它是否正确?如果是,什么
初始化期间处理 nil 值的正确方法是什么?我想检查 item.imageUrl
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
时,您总是必须检查它是否为 nil 或是否有值,但您已经提到您会在显示时执行此操作.
关于json - 如何在便利初始化程序中检查 Swift 中的 JSON nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42915989/