Почему не может быстро определить тип закрытия - PullRequest
0 голосов
/ 26 декабря 2018

На первой неделе в Swift, недавно созданный проект с Swift 4.2 на Xcode 10.1), я изучаю руководство по созданию приложения для фотогалереи Я поражен ошибкой компилятора.

Моя ситуация такова: внутри пользовательского ViewController , унаследованного от UIViewController и импортируемого UIKit и Photos .Этот метод вызывается из viewWillAppear как self.displayPhoto .

self.photosAsset и self.index isбудучи установленным предыдущим viewController в очереди.

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

Xcode жалуется на Невозможно определить тип закрытия в текущем контексте для закрытия в resultHandler.Какой тип выводить?

Глядя на документацию , похоже, что resultHandler имеет тип возврата void:

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Вы можете использовать Dictonary вместо NSDictionary, но нет необходимости объявлять типы параметров обработчика

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

, также вам не нужно назначать параметр типа [AnyHashable : Any]?, потому чтовам это не нужно, просто поставьте здесь подчеркивание _

... { image, _ in
    self.imgView.image = image
}
0 голосов
/ 26 декабря 2018

В 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
        }
    )
}
0 голосов
/ 26 декабря 2018

Вы сами вводите закрытие неправильно.Правильный тип:

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

У вас есть:

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

, что неверно.Это очень расстраивает компилятора!Просто убирайтесь с пути компилятора и пусть выводит типы;он знает, что они лучше, чем вы.Напишите

result, info in

и все будет хорошо.

...