2017-01-27 5 views
-1

Я новичок в swift и получил проблему с получением строки из функции, я пытаюсь использовать обработчик завершения, но что-то не так, не могли бы вы мне помочь?swift 3 обработчик завершения для возврата строки

После добавления [String: String] к func, я не могу получить результат, я хочу получить ответ и распечатать его. Ошибка: Невозможно преобразовать обратный expresion типа() для возврата типа [String: String]

просит:

public func login(userName: String, password: String) -> [String : String]{ 

let loginrequest = JsonRequests.loginRequest(userName: userName, password: password) 
return makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 

    print("\(JSON)") 

}) 

} 


private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) ->()) { 


    Alamofire.request(urlAddress, method: requestMethod, parameters: params, encoding: JSONEncoding.default).responseJSON { response in 

     switch response.result { 
     case .success: 
      if let jsonData = response.result.value { 
       completion(jsonData) 
      } 
     case .failure(let error): 
      if let data = response.data { 
       let json = String(data: data, encoding: String.Encoding.utf8) 
       print("Failure Response: \(json)") 

      } 

Вызов функции:

let retur = Json() 
    let rezultatas = retur.login(userName: "root", password: "admin01") 

    print(rezultatas) 

ошибки: enter image description here

+1

* «что-то не так» * является бесполезным описанием проблемы. –

ответ

1

Добро пожаловать Swift :)

Вы смешиваете синхронный и асинхронный код вместе.

Когда вы звоните: login вы ожидаете, что оно сразу же ответит на ваш запрос [String : String].

Но в своем методе login вы затем выполняете сетевой вызов, который не может сразу вернуться ... вот почему вызов Alamofire.request принимает блок завершения в качестве параметра.

Итак ... вам нужно изменить метод login так это:

  1. ничего не возвращает сразу (он не может сделать это ... войдя в нас требует делать сетевой вызов помню)
  2. принимает завершающий блок для вызова после успешного входа в систему.

Это можно сделать так:

public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) ->()) 

Здесь мы имеем функцию, которая принимает userName типа String, password типа String и loginCompletion типа function, что снова берет [String : String] словарь как параметр. Обратите внимание, что метод ничего не возвращает.

Теперь вы можете позвонить makeWebServiceCall почти как раньше:

let loginrequest = JsonRequests.loginRequest(userName: userName, password: password) 
makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 
    //Now we are ready, the login call has returned some data to you. 

    //You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so: 
    loginCompletion(yourConvertedDictionaryHere) 
}) 

Вот новый метод login в своей полноте:

public func login(userName: String, password: String, loginCompletion: @escaping ([String : String]) ->()) { 
    let loginrequest = JsonRequests.loginRequest(userName: userName, password: password) 
    makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 
     //Now we are ready, the login call has returned some data to you. 

     //You have an attribute named JSON of type Any, which you need to convert to [String : String], and then you can call loginCompletion with that, like so: 
     loginCompletion(yourConvertedDictionaryHere) 
    }) 
} 

И затем вы называете метод login следующим образом:

retur.login(userName: "root", password: "admin01") { stringDictionary: [String : String] in 
    //here you have your stringDictionary which you can use as pleased 
} 

Надеюсь, что вам поможет.

+0

Спасибо, ты помог мне, но все же я получаю ошибку, я обновил вопрос с новыми картина. –

+0

Я нашел решение, спасибо за помощь –

+0

Я попытался изменить тип, как вы говорите, но я получаю сообщение об ошибке, мне нужно получить ответ от сервера как строку и распечатать его. Я обновил свой вопрос –

0

сделать определение функции, как это

private func makeWebServiceCall (urlAddress: String, requestMethod: String, params:[String:Any], completion: @escaping (_ JSON : Any) ->()) { 

completion("Make a service call") 

} 

функция сделать вызов, как этот

makeWebServiceCall(urlAddress: "", requestMethod: "", params: ["Key" : "value"], completion: { (JSON : Any) in 

      print("\(JSON)") 

     }) 

Я изменил тип данных параметров из-за простоты. Также вы можете передавать данные любого типа в completion("Make a service call"). Надеюсь, это поможет вам.

+0

Хорошо, я думаю, что получаю, но все же я получаю ошибку с типами, вы можете проверить мой вопрос, я отредактировал его с кодом и ошибкой ошибки –

Смежные вопросы