对于Alamofire的result:
<code>public enum Result<Value, Error : ErrorType> {
case Success(Value)
case Failure(Error)
/// Returns `true` if the result is a success, `false` otherwise.
public var isSuccess: Bool { get }
/// Returns `true` if the result is a failure, `false` otherwise.
public var isFailure: Bool { get }
/// Returns the associated value if the result is a success, `nil` otherwise.
public var value: Value? { get }
/// Returns the associated error value if the result is a failure, `nil` otherwise.
public var error: Error? { get }
}
</code>现在对于函数:
<code> func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil ) -> Alamofire.Result<JSON, NSError> {
</code>中,最后想要去返回对应的result:
写成:
<code>func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil ) -> Alamofire.Result<JSON, NSError> {
Alamofire
.request(
httpMethod,
url,
parameters: parameters,
encoding: ParameterEncoding.JSON,
headers: currentHeaders)
.responseJSON(completionHandler: { response in
switch response.result {
case .Success(let value):
let valueJson = JSON(value)
if let code = valueJson["code"].int {
if code == 200 {
if let dataDict = valueJson["data"].dictionary {
//maybe empty/int/json/...
let dataJson = JSON(dataDict)
gLog.verbose("dataJson=\(dataJson)")
return Alamofire.Result.Success(dataJson)
}
</code>结果出错:
Cannot convert call result type ‘Result<_, _>’ to expected type ‘Void’ (aka ‘()’)
Cannot convert call result type ‘Result<_, _>’ to expected type ‘Void’ (aka ‘()’)
Cannot convert call result type Result<_, _> to expected type
参考:
A Swifter Way Of Handling Errors | Jens Ravens
要不去,自己手动创建一个:
结果用:
<code>enum HttpResult<T> {
case Success(T)
case Error(NSError)
}
func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil ) -> HttpResult<JSON> {
//let dataJson = JSON(dataDict)
let dataJson:JSON = JSON(dataDict)
gLog.verbose("dataJson=\(dataJson)")
return HttpResult.Success(dataJson)
</code>竟然还是同样错误:
Cannot convert call result type ‘HttpResult<_>’ to expected type ‘Void’ (aka ‘()’)
swift generic type
swift generic type result
The Swift Programming Language (Swift 2.2): Generics
Generics in Swift, Part 2 · Episteme and Techne
Introduction to Swift Generics
Swift Tutorial: Introduction to Generics
后来发现是自己的函数写错了:
是写在了Alamofire的response的completionHandler部分
-》其是属于返回为空的
-》可以通过定义看出:
<code> public func responseJSON(queue queue: dispatch_queue_t? = default, options: NSJSONReadingOptions = default, completionHandler: Alamofire.Response<AnyObject, NSError> -> Void) -> Self </code>
-》completionHandler是个闭包的代码段
得到的值是:
Alamofire.Response<AnyObject, NSError>
此处拿到的是response那个值
对应的返回值是:Void,即无返回值
-》所以此处返回了Alamofire.Result的变量,才出错的
—》对于:
<code>func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil ) -> Alamofire.Result<JSON, NSError> {
Alamofire
.request(
httpMethod,
url,
parameters: parameters,
encoding: ParameterEncoding.JSON,
headers: currentHeaders)
.responseJSON(completionHandler: { response in
。。。
return Alamofire.Result.Success(dataJson)
</code>所以才出错的
应该改为:
<code>func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil ) -> Alamofire.Result<JSON, NSError> {
Alamofire
.request(
httpMethod,
url,
parameters: parameters,
encoding: ParameterEncoding.JSON,
headers: currentHeaders)
.responseJSON(completionHandler: { response in
。。。
}
return Alamofire.Result.Success(dataJson)
}
</code>就可以了
->但是此处不是同步的函数,是async的异步函数,所以实际上去改为:
<code> func getUrlRespJson_async(httpMethod:Alamofire.Method, url:String, parameters: [String : AnyObject]? = nil, headers: [String : String]? = nil, respJsonHandler: (Alamofire.Result<JSON, NSError>)-> Void) {
Alamofire
.request(
httpMethod,
url,
parameters: parameters,
encoding: ParameterEncoding.JSON,
headers: currentHeaders)
.responseJSON(completionHandler: { response in
switch response.result {
case .Success(let value):
let valueJson = JSON(value)
if let code = valueJson["code"].int {
if code == 200 {
if let dataDict = valueJson["data"].dictionary {
let dataJson:JSON = JSON(dataDict)
respJsonHandler(Alamofire.Result.Success(dataJson))
} else {
let emptyDataJson = JSON("")
respJsonHandler(Alamofire.Result.Success(emptyDataJson))
}
} else {
}
}
case .Failure(let error):
}
})
</code>就可以了。
转载请注明:在路上 » [已解决]swift中result使用出错:Cannot convert call result type Result to expected type Void aka