在Swift中将图像URL字符串转换为可视协议?

问题描述 投票:0回答:1

我正在尝试在我的Viewer项目中实现Swift Pod包,根据文档,我需要创建一个符合以下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
swift swift-protocols
1个回答
0
投票

我认为更好的选择是创建一个单独的类(在这种情况下为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))
}
© www.soinside.com 2019 - 2024. All rights reserved.