进入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具有一个空返回类型:
答案 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
,一切都会好起来的。