#swift5
#swift5
Вопрос:
Я просто хотел включить Result в свой проект и столкнулся с несколькими проблемами. Мне кажется, что Alamofire (который уже является зависимостью) определяет свой собственный тип результата, вызывающий проблемы при попытке написать функции, возвращающие результаты.
Например, Xcode (10.2 beta 4) сообщает мне, что я не могу написать Result-> Response = (_ result: Result) -> Void, потому что универсальный тип ‘Result’, специализирующийся на слишком малом количестве параметров типа (получено 1, но ожидалось 2).
Оба связаны как фреймворки, установленные через Cocoapods в проекте «Swift 5.0 beta».
Я предполагаю, что подобные проблемы на самом деле не должны возникать, но я делаю что-то не так здесь. Любые указания были бы замечательными, спасибо!
import Foundation
import Alamofire
typealias Response<T> = (_ result: Result<T>) -> Void //error here
class APIClient {
private static let baseUrl: URL = URL(string: "https://api.flickr.com/services/rest/")!
private static let key: String = "8e15e775f3c4e465131008d1a8bcd616"
private static let parameters: Parameters = [
"api_key": key,
"format": "json",
"nojsoncallback": 1
]
static let shared: APIClient = APIClient()
let imageCache = NSCache<NSString, UIImage>()
@discardableResult
private static func request<T: Decodable>(path: String? = nil,
method: HTTPMethod,
parameters: Parameters?,
decoder: JSONDecoder = JSONDecoder(),
completion: @escaping (Result<T>) -> Void) -> DataRequest {
let parameters = parameters?.merging(APIClient.parameters, uniquingKeysWith: { (a, _) in a })
return AF.request(try! encode(path: path, method: method, parameters: parameters))
.responseDecodable (decoder: decoder) { (response: DataResponse<T>) in completion(response.result) }
}
Ответ №1:
Вы можете указать ссылку на результат, чтобы выбрать тот, который вы хотите. Версия с одним параметром принадлежит Alamofire. Тип с двумя параметрами принадлежит Swift.
typealias Response<T> = (_ result: Alamofire.Result<T>) -> Void
... or ...
static func upload(
data: Data,
completion: @escaping (Swift.Result<Int, Error>) -> Void
)
Ответ №2:
В Alamofire 5.1.0 изменение :
typealias Response<T> = (_ result: Result<T>) -> Void
Для
typealias Response<T> = (_ result: AFResult<T>) -> Void
сработало.
Комментарии:
1. ДА. То же самое применимо к Alamofire > 5.2.0