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.
Sie sollten sehen https://stackoverflow.com/questions/27390656/how-to-return-value-from-alamofire – rmaddy
Sie sollten auch auf den Umfang der Variablen studieren. – rmaddy