【发布时间】:2020-02-02 19:57:53
【问题描述】:
我有一个扩展程序允许我从 API 将图像下载到我的 UITableView。
extension UIImageView {
func donwloadImage(from url: String) {
let urlRequest = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil {
print(error)
return
}
DispatchQueue.main.async {
self.image = UIImage(data: data!)
}
}
task.resume()
}
}
如果imageUrl 是nil,应用程序会崩溃。
我如何使用?? 包装它,所以如果没有图像,UIImageView 只是空白?
这是一个数据模型和获取数据函数
class Article: NSObject {
var headline: String?
var date: String?
var imageUrl: String?
var desc: String?
var url: String?
}
@objc func fetchArticles() {
let urlRequest = URLRequest(url: URL(string: "https://newsapi.org/v2/everything?pageSize=15&sortBy=publishedAt&apiKey=API_KEY")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil {
print(error)
return
}
self.articles = [Article]()
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
if let articlesFromJson = json["articles"] as? [[String: AnyObject]] {
for articlesFromJson in articlesFromJson {
let article = Article()
if
let title = articlesFromJson["title"] as? String,
let publishedAt = articlesFromJson["publishedAt"] as? String,
let urlToImage = articlesFromJson["urlToImage"] as? String,
let description = articlesFromJson["description"] as? String,
let url = articlesFromJson["url"] as? String
{
article.headline = title
article.date = publishedAt
article.imageUrl = urlToImage
article.desc = description
article.url = url
}
self.articles?.append(article) // and so on...
【问题讨论】:
-
您不能在
URL(string:中指定默认值,除非该字符串表示占位符图像的有效 URL。 -
也许我可以提供一些 google 'empty image' url 作为默认值?
-
“如果
imageUrl是nil,应用程序就会崩溃。” ...然而,在您的代码 sn-p 中,没有imageUrl。也许您可以与imageUrl分享一个代码 sn-p,向我们展示它在哪里崩溃。但典型的模式是imageView.image = nil; if let url = imageUrl { ... }。或者,如果您不想将image设置为nil,请使用项目中的一些占位符图像。 -
不用说,
nil-coalescing 运算符??在这里不是正确的技术。使用if let x = y { ... }或guard let x = y else { ... }模式。 -
先生 Rob 我已经添加了更多的代码 sn-ps,请看一下
标签: ios swift forced-unwrapping swift-optionals