如何使用枚举处理来自多个结果的数据

时间:2019-11-10 04:14:43

标签: ios swift enums

我想从我的对象中获取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
            }
        }
    }

1 个答案:

答案 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类型。