2015-08-28 33 views
1

我做一個網站上的要求,我想回到3個字符串,但我得到這個問題:問題與NSURLSession返回元組

元組類型「(StringLiteralConvertible,StringLiteralConvertible,StringLiteralConvertible)」和「()」有不同數量的元素(3對0)

這是我的代碼看起來像:

func downloadContent() -> (title : String, message : String, buttonText : String)? { 
    let url = NSURL(string: websitePath)! 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in 
     if error != nil { 
      print(error?.localizedDescription) 

      return ("", "", "") 
     } 

    } 

    task.resume() 

    return nil 
} 

回答

4

你的代碼中有錯誤。如果你仔細看看它,你會從一個閉包中返回,這個閉包的返回值是Void。這就是錯誤的原因,

'(StringLiteralConvertible, StringLiteralConvertible, StringLiteralConvertible)' and '()' 

類型'()'表示它是一個預期的空類型。

那麼,哪裏是你的錯誤,

在你dataTaskWithURL方法,封閉看起來是這樣的,

{ (data, response, error) -> Void in 
     if error != nil{ 
      print(error?.localizedDescription) 

      return ("","","") 
     } 
    } 

的封閉預計要返回void類型,但是你返回字符串的元組。

上面的代碼不好的一件事是關於異步代碼執行。 dataTask異步運行並立即返回,所以你不能返回它的值。調用完成後,您應該使用某個完成塊來獲取結果。

我建議你重新調整它,它的下面,

func downloadContent(completion: (title : String, message : String ,buttonText : String)? -> Void){ 
    let url = NSURL(string: websitePath)! 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in 
     if error != nil{ 
      print(error?.localizedDescription) 
     } 

     completion((title: "", message: "", buttonText: "")) 
    } 

    task.resume() 
} 
1

聲明return ("","","")從關閉返回而不是從downloadContent()函數返回。

由於封閉定義聲明Void - 即:() - 返回類型,編譯器會使用您收到的錯誤消息進行投訴。

2

NSURLSession作品的背景,所以你需要一個回調函數:

func downloadContent(callback: (title: String?, message: String?, buttonText: String?) -> Void) { 
    let url = NSURL(string: websitePath)! 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in 
     if error != nil { 
      print(error?.localizedDescription) 

      callback(title: "", message: "", buttonText: "") 
     } 

    } 

    task.resume() 
}