Что вызывает эту ошибку «Не удается преобразовать тип» в Swift? - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу вызвать простой API и вернуть структуру JSON, возвращенную с сервера.Я использую alamofire для достижения этой цели.

Это моя функция

func loginUser(user_name: String, password: String, callBack:(Login) -> Void){
    let parameters: Parameters = ["user_name":  user_name,"password": password];
    let urlString=serverURL+"login.php";
    Alamofire.request(urlString, method: .post, parameters: parameters, encoding: URLEncoding.httpBody)
        .responseJSON { response in
            if let status = response.response?.statusCode {
                switch(status) {
                case 200:
                    guard response.result.isSuccess else {
                        //error handling
                        return
                    }
                    if let login: Login = response.result.value {
                        callBack(login)
                    } else {
                        callBack(Login(user_id: 0, status:0))
                    }
                default:
                    print("HTTP Error : \(status)")
                    callBack(Login(user_id: 0, status:0))
                }
            }
    }
}

struct Login {
  let user_id: Int
  let status: Int
}

Эта строка генерирует ошибку «невозможно преобразовать тип».

if let login: Login = response.result.value {

Что я делаю не так?

1 Ответ

0 голосов
/ 22 февраля 2019

Как прокомментировал mag_zbc, response.result.value это либо [String : Any], либо Array.

Итак, сначала вам нужно привести их к соответствующему типу, например, предположим, что это [String : Any], вы можете разыграть его, как показано ниже:

if let response = response.result.value as? [String : Any] {
    //here you will get your dictionary
}

Теперь следующее, что вам нужно сделать, - это вынуть значения из вашего response объекта, что вы можете сделать, получая доступ к значениям из ключей из вашего response объекта, который будет выглядеть как:

let user_id = response["userid_key"] as? Int ?? 0
let status = response["status_key"] as? Int ?? 0

Таким образом, вы получите user_id и status от вашего response объекта, а затем последним шагом будет установка этих данных в вашу структуру, как показано ниже:

let login = Login(user_id: user_id, status: status)

Теперь вы можете установить обратный вызов с помощью callBack(login)

, и ваш окончательный код будет выглядеть так:

if let response = response.result.value as? [String : Any] {

    let user_id = response["userid_key"] as? Int ?? 0
    let status = response["status_key"] as? Int ?? 0

    let login = Login(user_id: user_id, status: status)

    callBack(login)
}
...