我从另一个开发人员那里继承了一个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/