2017-06-20 2 views
1

Meine aktuelle Funktion ist wie folgt:Rückgabewert undefiniert Swift

public func getToken() -> String { 
    Alamofire.request("url", method: .post, encoding: JSONEncoding.default) 
     .responseData { response in 
      if let data = response.data { 
       let xml = SWXMLHash.parse(data) 
       let token = ((xml["authResponse"] ["authToken"].element?.text))! 
      } 
     } 

    return token // Test is undefined down here 
} 

ich diese Funktion zu erhalten, versuchen den Token-String zurück, aber die Variable token ist nicht definiert.

+0

Sie sollten sehen https://stackoverflow.com/questions/27390656/how-to-return-value-from-alamofire – rmaddy

+0

Sie sollten auch auf den Umfang der Variablen studieren. – rmaddy

Antwort

0

Es gibt mehrere Probleme mit diesem Code. Die erste und offensichtlichste ist, dass token nur im Bereich innerhalb der inneren Schließung ist, so ist es nicht definiert, wo Ihre return Anweisung befindet. Das zweite Problem besteht jedoch darin, dass Ihre Alamofire-Anforderung asynchron erfolgt, die Signatur Ihrer getToken-Methode jedoch davon ausgeht, dass der resultierende Wert synchron bereitgestellt wird.

Ich würde vorschlagen, die Signatur Ihrer Methode zu ändern, um eine andere Schließung als Parameter als "Callback" -Methode zu akzeptieren. Etwas in diese Richtung:

public func getToken(callback: ((String?) -> Void)) -> String { 
    Alamofire.request("url", method: .post, encoding: JSONEncoding.default) 
     .responseData { response in 
      if let data = response.data { 
       let xml = SWXMLHash.parse(data) 
       let token = ((xml["authResponse"] ["authToken"].element?.text))! 
       callback(token) 
      } else { 
       callback(nil) 
      } 
     } 
} 

Dann Sie es so nennen könnten:

getToken(callback: { token in 
    if let token = token { 
     print("Got the token: \(token)") 
    } else { 
     print("Didn't get the token: ¯\_(ツ)_/¯") 
    } 
}) 

Sie würden wahrscheinlich wollen einige robuste Fehlerbehandlung hinzuzufügen, und vielleicht einen Weg zwischen einem Fehler eindeutig zu machen und ein tatsächlicher nil Wert wird zurückgegeben (falls das überhaupt möglich ist). Ich würde auch vorschlagen, die erzwungene Entpackung in Ihrer getToken Methode loszuwerden. Hoffentlich löst das dein ursprüngliches Problem.