为什么不能快速推断出闭合类型

时间:2018-12-26 20:23:07

标签: ios swift photosframework phimagemanager

进入Swift的第一个星期,它是在Xcode 10.1上使用Swift 4.2刚创建的项目),我following a tutorial on a how to make a photo gallery app对编译器错误大为惊讶。

我的情况是,在自定义 ViewController 中继承自 UIViewController ,并导入 UIKit 照片。此方法从 viewWillAppear 作为 self.displayPhoto 调用。

self.photosAsset self.index 由segue上的先前viewController设置。

981

Xcode抱怨无法在resultContext中推断闭包类型在当前上下文中。有什么类型可以推断?

Looking at the documentation看起来resultHandler具有一个空返回类型:

3 个答案:

答案 0 :(得分:3)

resultHandler中,您应该使用(image, _)而不是(result:UIImage!, info:NSDictionary!)

func displayPhoto() {
    let imageManager = PHImageManager.default()
    var ID = imageManager.requestImage(
        for: self.photosAsset[self.index] as PHAsset,
        targetSize: PHImageManagerMaximumSize,
        contentMode: .aspectFit,
        options: nil,
        resultHandler: { (image, _) in
            self.imgView.image = image
        }
    )
}

注意:要改善您的方法,您可能需要在PHImageRequestOptions中设置options:

func displayPhoto() {
    let imageManager = PHImageManager.default()
    let requestOption = PHImageRequestOptions()
    requestOption.isSynchronous = true
    requestOption.deliveryMode = .highQualityFormat

    var ID = imageManager.requestImage(
        for: self.photosAsset[self.index] as PHAsset,
        targetSize: PHImageManagerMaximumSize,
        contentMode: .aspectFit,
        options: requestOption,
        resultHandler: { (image, _) in
            self.imgView.image = image
        }
    )
}

答案 1 :(得分:2)

您可以使用Dictonary代替NSDictionary,但是不需要声明处理程序参数的类型

... { result, info in
    ...
}

您也不必分配类型[AnyHashable : Any]?的参数,因为您不需要它,只需在_下方加下划线即可

... { image, _ in
    self.imgView.image = image
}

答案 2 :(得分:1)

您自己输入的关闭字词错误。正确的类型是:

@escaping (UIImage?, [AnyHashable : Any]?) -> Void

您有:

(result:UIImage!, info:NSDictionary!) in

这是错误的。这对于编译器来说是非常不愉快的!只是摆脱编译器的方式,并 let 推断类型;它知道它们比您更好。写

result, info in

,一切都会好起来的。