【问题标题】:Default value for optional type 'URL?'可选类型“URL?”的默认值
【发布时间】: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()
    }

}

如果imageUrlnil,应用程序会崩溃。

我如何使用?? 包装它,所以如果没有图像,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 作为默认值?
  • “如果imageUrlnil,应用程序就会崩溃。” ...然而,在您的代码 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


【解决方案1】:

我建议你使用一个异步下载图片的POD,总是留下一个placeHolder的图片,看看下面的例子:

import SDWebImage

imageView.sd_setImage (
   with: URL (string: "http://www.example.com/image.jpg"), 
   placeholderImage: UIImage (named: "placeholder.png") // define your default Image
)

POD 链接:https://cocoapods.org/pods/SDWebImage

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多