表达式类型不明确,没有更多上下文- Swift

gijlo24d  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(159)

我在这里得到这个错误:

image.load(url: product?.productImage!)

图像的定义:

@IBOutlet var image: CellImageView!

下面是我的CellImageView类:

import UIKit

class CellImageView: UIImageView {
    var task: URLSessionDataTask!
    var imageCache = NSCache<AnyObject, AnyObject>()

    func load(url: String) {
        let real_url = url.replacingOccurrences(of: *image_path_here*, with: *image_path_here*)
        let imageUrl = URL(string: real_url)
        image = nil

        if let task = task {
            task.cancel()
        }

        if let imageFromCache = imageCache.object(forKey: imageUrl?.absoluteString as AnyObject) as? UIImage {
            image = imageFromCache
        }

        task = URLSession.shared.dataTask(with: imageUrl!, completionHandler: { data, _, error in
            guard let data = data, let newImage = UIImage(data: data) else {
                print(error)
                return
            }
            self.imageCache.setObject(newImage, forKey: imageUrl?.absoluteString as AnyObject)
            DispatchQueue.main.async {
                self.image = newImage
            }
        })
        task.resume()
    }
}

我不知道为什么这给我一个错误。有人能帮助我吗?

xxb16uws

xxb16uws1#

当编译器无法推断并随后验证代码中的类型时,通常会发生此错误。在这种情况下,您将调用

func load(url: String)

所以这个方法需要一个String作为参数。但是你调用它的时候使用了一个可选的product?.productImage!参数(!不会覆盖类的?,所以它仍然是可选的。
您需要正确处理可选

if let product = product, productImage = product.productImage {
   image.load(url: productImage}
}

您可能也需要重新考虑缓存。您使用了一个local参数来保存该高速缓存,因此每次创建类的一个新示例时,都会创建一个新的空缓存。而且imageView也不是缓存的最佳位置;请考虑将所有网络和缓存提取到一个专用控制器。

相关问题