2016-05-22 10 views
-2

Die Methode gibt keinen Wert zurück, der von einer GET-Anforderung stammt, wobei die Variable res im Aufgabenabschnitt gedruckt werden kann, aber am Ende nicht zurückgegeben werden kann.meine Swift-App kann keinen Wörterbuchwert zurückgeben

func lookUpTheWord(word:String) -> NSDictionary { 
    var res = NSDictionary() 
    let urlString = "https://wordsapiv1.p.mashape.com/words/" + word 
    if let url = NSURL(string:urlString) { 
     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.addValue("this is a key", forHTTPHeaderField: "X-Mashape-Key") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 
      if error != nil { 
       print("\(error)") 
       return 
      } 
      res = self.toJson(data!) 
      print(res) //it works here 
     } 
     task.resume() 
    } 
    return res //res becomes nil 
} 
+1

Mögliches Duplikat [Swift: Wie kann ich einen Wert innerhalb einer asynchronen urlsession Funktion zurückgeben] (http://stackoverflow.com/questions/27081062/swift-how-do-i-return-a-value-innerhalb-einer-asynchronen-urlsession-Funktion) –

Antwort

1

Das liegt daran, dass Sie die Variable res zurückgeben, bevor sie zugewiesen wurde. Sie werden feststellen, dass das res, das nicht Null ist, nach demjenigen gedruckt wird, das danach ist. Dies liegt daran, dass die HTTP-Anfrage nicht sofort ausgeführt wird - der Code, nachdem er ausgeführt wurde, bevor er beendet ist, daher wird er "asynchron" genannt.

Wenn Sie die in der HTTP-Anfrage erfasste Variable verwenden möchten, verwenden Sie eine Schließung als Parameter in Ihrer Funktion und rufen Sie sie auf, wenn die Anfrage abgeschlossen ist. Beispiel:

func lookUpTheWord(word:String, completion: (NSDictionary->Void)) { 
    var res = NSDictionary() 
    let urlString = "https://wordsapiv1.p.mashape.com/words/" + word 
    if let url = NSURL(string:urlString) { 
     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.addValue("this is a key", forHTTPHeaderField: "X-Mashape-Key") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 
      if error != nil { 
       res = self.toJson(data!) 
       completion(res) 
      } 
     } 
     task.resume() 
    } 
} 

wie folgt verwendet:

lookUpTheWord("word") { res in 
    print(res) 
} 
Verwandte Themen