0

我正在尝试下载一些图像并在Stack Overflow上找到了解决方案

它使用了一些我不理解的闭包语法。

func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
    URLSession.shared.dataTask(with: url) { data, response, error in
        completion(data, response, error)
        }.resume()
}

它创建了一个函数,并且允许转义完成参数,对吗?然后这个函数返回一个 URLSession?return 语句在哪里?

“数据、响应、错误”声明是什么意思?

然后它调用一个名为 completion(...) 的函数,它在哪里定义和实现?

我想这是一些我不知道的语法。关于在哪里阅读有关此内容的任何提示?

然后我调用了这个函数:

    getDataFromUrl(url: url){ data, response, error in
        guard let data = data, error == nil else {return}
        DispatchQueue.main.async {
            let image = UIImage(data: data)
            print(image!)
            self.m_images?.append(image!)
            print(self.m_images!.count)
        }
    }

self.m_images 是一个数组:[Any],在我的 viewController 顶部声明如下:

var m_images:[Any]?=nil

打开包装时出现错误,它仍然为零:为什么?我只是附加了一张图片。该图像确实存在,我打印它并且它工作正常。

4

1 回答 1

2

completion被声明为一个带有 3 个参数并且在getDataFromUrl函数中没有返回值的闭包。

 ... completion: @escaping (Data?, URLResponse?, Error?) -> () ...

闭包可以表示为

{ (data, response, error) -> Void in 
  // code 
}

在函数completion中调用传递参数

completion(data, response, error)

出现问题中的错误是因为var m_images已声明但未初始化。目前,您正在将对象附加nil到代码崩溃中。

基本上永远不要[Any]像类型实际上更具体一样声明数组。

将图像数组声明并初始化为非可选数组UIImage

var mImages = [UIImage]()

然后检查是否可以使用可选绑定创建图像

if let image = UIImage(data: data) {
    print(image)
    self.mImages.append(image)
    print(self.mImages.count)
}

注意:与 PHP 或 JavaScript 不同,变量在 Swift 中应该是camelCased而不是snake_cased

于 2017-11-08T08:27:46.913 回答