Я хочу получить UIImage и заголовок из моего объекта, поэтому я делаю общий результат с enum.
, но у меня возникает ошибка, когда я пытаюсь принять мой результат в завершение, и ошибка, когда я вызываю мой func fetchDataResult (для видео: видео, завершение: @escaping (Results <(UIImage ?, String?)>) -> ()) в моем контроллере. Это мой код.
Элемент «success» в «Results <(UIImage ?, String?)>» Создает результат типа «Results», но контекст ожидает «Results <(UIImage ?, String»?)> '
enum Results<Value> {
case success(Value)
case failure(Error)
}
class VideoStore {
func fetchDataResult(for video: Video, completion: @escaping (Results<(UIImage?, String?)>) -> ()) {
guard let videoKey = video.videoID else {
preconditionFailure("Video expected to have a video id")
}
if let image = imageStore.image(forKey: videoKey) {
OperationQueue.main.addOperation {
completion(.success((image, nil)))
}
return
}
guard let videoURL = video.url else {
preconditionFailure("Video expected to have video url")
}
if let videoTitle = video.title {
OperationQueue.main.addOperation {
completion(.success((nil, videoTitle)))
}
}
let request = URLRequest(url: videoURL)
let task = sessions.dataTask(with: request) { (data, response, error) in
let result = self.processDataRequest(data: data, error: error)
if case let .success(image) = result {
self.imageStore.setImage(image, forKey: videoKey)
}
OperationQueue.main.addOperation {
completion(.success((result, nil)))
}
}
task.resume()
}
private func processDataRequest(data: Data?, error: Error?) -> Results<UIImage> {
guard
let imageData = data,
let image = UIImage(data: imageData) else {
if data == nil {
return .failure(error!)
} else {
return .failure(ThumbnailError.thumbnailCreationError)
}
}
return .success(image)
}
}
Это мой VideoController с ошибкой
Невозможно присвоить значение типа' (UIImage ?, String?) 'Для типа'UIImage?
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let video = videoDataSource.videos[indexPath.row]
videoStore.fetchDataResult(for: video) { (results) in
guard
let videoIndex = self.videoDataSource.videos.firstIndex(of: video),
case let .success(image) = results else { return }
let photoIndexPath = IndexPath(item: videoIndex, section: 0)
if let cell = tableView.cellForRow(at: photoIndexPath) as? VideoCell {
cell.videoImgView.image = image
}
}
}