以前,它可以与Swift 3
一起很好地工作,但是当我切换到Swift 4
时,找不到类型为JSON(SwiftyJson Library)
的完成问题
static func getRoster(information: [String: String], completion:@escaping ([Player],JSON,Paging?,WSResponse,NSError?) -> Void){
Alamofire.request(NetWorkingConstants.baseURL+NetWorkingConstants.Team.get_all_roster, method: .post, parameters: information, encoding: JSONEncoding.default, headers:StarsLeagueUser.sharedInstance.getDefaultHeaders()).responseJSON { (response) in
switch response.result {
case .success(let value):
let json = JSON(value)
let wsResponse = WSResponse(code: json["response_code"].stringValue, message: json["message"].stringValue)
if wsResponse.code == ServerCode.success{
print("Success")
}else if wsResponse.code == ServerCode.unauthorized{
print("Session Expire")
}
case .failure(let error):
print("Network Error")
let wsResponse = WSResponse(code: "1000", message: "Network Error")
completion([],nil,nil,wsResponse,error as NSError?)//Here is error - Nil is not compatible with expected argument type 'JSON'
print("GetRoster")
}
}
}
答案 0 :(得分:1)
更改为({,JSON?
)
func getRoster(information: [String: String],
completion:@escaping ([Player],JSON?,Paging?,WSResponse,NSError?) -> Void){
要能够返回nil值,那么它应该是可选的
将返回类型JSON
设为非可选意味着您必须返回非可选值,因此像您一样,返回nil就是一个问题
var str1:String = nil // error
var str2:String? = nil // ok
答案 1 :(得分:0)
发生此错误是因为如果参数类型是非可选的,则无法通过nil
。将JSON
声明为可选(JSON?
)。
在您的情况下,我建议使用带有关联类型的枚举作为结果类型。
好处是参数可以更好地排列,并且您总是使用非可选类型,因为您只返回相关参数
enum Result {
case success([Player], JSON, Paging, WSResponse)
case failure(WSResponse, Error)
}
然后声明您的方法
func getRoster(information: [String: String], completion:@escaping (Result) -> Void) {
并在失败的情况下返回
let wsResponse = WSResponse(code: "1000", message: "Network Error")
completion(.failure(wsResponse, error))
在调用方方法中,使用switch
switch result {
case let .success(players, json, paging, response):
// handle success
case let .failure(response, error):
// handle error
}