我想从我的对象中获取UIImage和标题,以便使用枚举生成通用结果。
但是当我尝试将结果放入completionHandler时出错,而我调用我的 func fetchDataResult(对于视频:视频,完成:@escaping(Results <(UIImage ?, String?)> )->())。这是我的代码。
'Results <(UIImage ?, String?)>'中的成员'success'产生类型为'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
}
}
}
答案 0 :(得分:1)
以下行中的results
:
videoStore.fetchDataResult(for: video) { (results) in
具有类型(UIImage?, String?)
。
fetchDataResult
的完成处理程序将获得您定义的类型Results<(UIImage?, String?)>
,从而使case success(Value)
变为case success((UIImage?, String?))
。
如果您只需要从值中获取UIImage?
,则需要这样做
guard
let videoIndex = self.videoDataSource.videos.firstIndex(of: video),
case let .success(image, _) = results else { return }
请注意,自Swift 5起,Swift拥有自己的Results
类型。