我正在尝试在我的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
我认为更好的选择是创建一个单独的类(在这种情况下为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))
}