2017-01-27 7 views
2

Ich bin neu bei Swift und ich habe einige Probleme. Ich versuche, einen Wert von meiner Anfrage zu erhalten. Ich kann es als Schließung drucken, aber ich möchte als Zeichenfolge auf einem VC erhalten und damit arbeiten, aber auf Funktion Login. Ich kann nicht herausfinden, wie ich von einer Schließung zurückkehren kann.swift 3 Aufruf Funktion mit Abschluss Schließung im Gegenzug

Funktion mit Verschluss:

class Json { 
var loginToken = "" 


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

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


    //let jsons = JSON 
    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(let data): 
      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) 
       completion("Failure Response: \(json)") 

      } 

Aufruf Funktion auf VC:

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

    print(rezultatas) 
+0

Sie können nicht von einer Schließung zurückkehren. – ebby94

+0

Siehe meine Antwort auf Ihre vorherige Frage hier: http://Stackoverflow.com/a/41889841/4063602 – pbodsk

+0

Warum möchten Sie Wert von Login-Methode zurückgeben? –

Antwort

3

Sie können nicht von einer Schließung zurückkehren. Beachten Sie außerdem, dass Ihre Funktion einen Webservice-Anruf tätigt. Wenn dieses Teil gefunden wird, geht das Steuerelement nicht sofort in den Block und die gesamte Funktionsausführung ist beendet, bevor der Block ausgeführt wird. Anstatt einen Wert zurückzugeben, können Sie Ihrer Login-Funktion einen weiteren Abschlussblock hinzufügen. Fügen Sie Ihrer login Funktion ein weiteres Argument hinzu.

public func login(userName: String, password: String, completion: @escaping(Any)->Void) 

Innerhalb der Login-Funktion, entfernen Sie die return-Anweisung und tun so etwas wie dieses

makeWebServiceCall(urlAddress: URL, requestMethod: .post, params: loginrequest, completion: { (JSON : Any) in 
    completion(JSON) 
}) 

Und wenn Sie Ihre Login-Funktion alles, was Sie tun müssen, rufen ist, zu

login(userName: "", password:""){(response) in 
    print(response) 
} 

Sie habe die Daten, die Sie hier übergeben wollten

+0

Danke, habe meine Antwort –

0

Ihre Methode: public func login(userName: String, password: String) -> (Any) implementiert ein Verfahren mit einem Abschluss-Handler, speziell: private func makeWebServiceCall (urlAddress: String, requestMethod: HTTPMethod, params:[String:Any], completion: @escaping (_ JSON : Any) ->()).

Das bedeutet, dass die Login-Funktion eine unbekannte Zeit braucht, also muss auch ein Completion-Handler implementiert werden (was in einem Closure erledigt werden kann), anstatt einen Wert zurückzugeben (was nicht möglich ist) Schließung).

Verwandte Themen