我从另一个开发者那里继承了一个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)
}
}
答案 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
时,你总是要检查它是否为零或有值,但你已经提到你要在显示它。