问题与NSURLSession返回元组

问题描述:

我做一个网站上的要求,我想回到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 
} 

你的代码中有错误。如果你仔细看看它,你会从一个闭包中返回,这个闭包的返回值是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() 
} 

声明return ("","","")从关闭返回而不是从downloadContent()函数返回。

由于封闭定义声明Void - 即:() - 返回类型,编译器会使用您收到的错误消息进行投诉。

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() 
}