我只是想将Result包含在我的项目中,并且遇到了一些问题。在我看来,Alamofire(已经是一个依赖项)在尝试编写返回结果的函数时定义了自己的Result类型,从而引发了问题。
例如Xcode(10.2 beta 4)告诉我,我无法编写Result-> Response =(_ result:Result)-> Void,因为通用类型'Result'专用于过少的类型参数(获得1,但预期为2) 。
两者都链接为在“ Swift 5.0 beta”项目中通过Cocoapods安装的框架。
我猜这种问题实际上不应该发生,但是我在这里做错了。任何指针都很好,谢谢!
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) }
}Run Code Online (Sandbox Code Playgroud)
小智 21
您可以限定对Result的引用,以选择所需的引用。具有一个参数的版本属于Alamofire。带有两个参数的那个属于Swift。
typealias Response<T> = (_ result: Alamofire.Result<T>) -> Void
... or ...
static func upload(
data: Data,
completion: @escaping (Swift.Result<Int, Error>) -> Void
)
Run Code Online (Sandbox Code Playgroud)
在 Alamofire 5.1.0 中改变:
typealias Response<T> = (_ result: Result<T>) -> Void
Run Code Online (Sandbox Code Playgroud)
到
typealias Response<T> = (_ result: AFResult<T>) -> Void
Run Code Online (Sandbox Code Playgroud)
工作。
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |