Nil与预期的参数类型'JSON'不兼容

时间:2018-12-23 10:56:19

标签: json swift completionhandler

以前,它可以与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")
            }
        }
    }

2 个答案:

答案 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
}