Соответствует ли URL-адрес изображения строке для просмотра протокола в Swift? - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь реализовать пакет Viewer в моем проекте Swift, и в соответствии с документацией мне нужно создать коллекцию элементов, которые соответствуют протоколу Viewable ниже.

Как мне согласовать изображение String в моем for-loop ниже с Viewable протоколом ниже?

Протокол:

public enum ViewableType: String {
    case image
    case video
}

public protocol Viewable {
    var type: ViewableType { get }
    var assetID: String? { get }
    var url: String? { get }
    var placeholder: UIImage { get }

    func media(_ completion: @escaping (_ image: UIImage?, _ error: NSError?) -> Void)
}

Это мой код:

    var images = [String]()
    var viewableImages = [Viewable]()

    override func viewDidLoad() {

     loadViewableImages()

    }

    fileprivate func loadViewableImages(){

            viewableImages.removeAll()

            for image in images{
                viewableImages.append(image) //need to append a Viewable type image not a String
            }


}//end func

1 Ответ

0 голосов
/ 01 октября 2019

Я думаю, что лучшим вариантом является создание отдельного класса (в данном случае Image), который подтвердит протокол Viewable:

class Image: Viewable {
    var type: ViewableType {
        return .image
    }
    let assetID: String? = UUID().uuidString
    let placeholder = UIImage()

    let url: String?

    init(url: String) {
        self.url = url
    }

    func media(_ completion: @escaping (_ image: UIImage?, _ error: NSError?) -> Void) {
         guard let url = url else { 
            completion(nil, nil)
            return
         }
         guard let imageURL = URL(string: url) else {
            completion(nil, nil)
            return
         }
         URLSession.shared.dataTask(with: imageURL) { (data, response, error) in
             DispatchQueue.main.async { //all changes to UI must be called on main thread
                if let error = error {
                    print("Error: \(error)")
                    completion(nil, error)
                    return
                }
                completion(UIImage(data: data), nil)
            }
      }.resume()
    }
}

, и вам нужно будет изменить цикл на:

for image in images{
    viewableImages.append(Image(url: image))
}
...