В дополнение к ответу Мохмада S , для реализации fetchPhotos
, кажется, что использование перечислений было бы более уместным, потому что в параметре completion
мы задаем как "результат ИЛИ ошибка".
Вы можете реализовать что-то вроде:
enum CustomError: Error {
case notFound
}
enum Result<T> {
case success(T)
case failure(CustomError)
}
protocol Switchable: Decodable { }
struct Video: Switchable { }
struct Photo: Switchable { }
Следовательно, fetchPhotos
as:
func fetchPhotos(url: String, completion: @escaping (Result<[Switchable]>) -> Void) {
// in case of error:
let error: CustomError? = CustomError.notFound
if let error = error {
completion(.failure(error))
}
// in case of success - videos:
completion(.success([Video(), Video()]))
// in case of success - photos:
completion(.success([Photo(), Photo()]))
}
Называя его как:
fetchPhotos(url: "...") { result in
switch result {
case .success(let photos):
// in case of photos
if let photos = photos as? [Photo] { /**/ }
// in case of videos
if let videos = photos as? [Video] { /**/ }
// in case of mix of photos and videos, you should iterate through it and check each object
photos.forEach({ photo in
if let media = photo as? Photo {
} else if let media = photo as? Video {
}
})
case .failure(let error):
print(error.localizedDescription)
}
}