Nil не совместим с ожидаемым типом аргумента 'JSON' - PullRequest
0 голосов
/ 23 декабря 2018

Раньше он хорошо работал с 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 голосов
/ 23 декабря 2018

Ошибка возникает из-за того, что вы не можете передать 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
}
0 голосов
/ 23 декабря 2018

Изменить на (,JSON?)

func getRoster(information: [String: String], 
 completion:@escaping ([Player],JSON?,Paging?,WSResponse,NSError?) -> Void){

Чтобы иметь возможность возвращать нулевое значение, оно должно быть необязательным

Делать тип возврата JSON как неНеобязательный означает, что вы должны вернуть не необязательное значение, поэтому возвращение nil является проблемой, как вы делаете

var str1:String = nil // error 
var str2:String? = nil // ok  
...