问题与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()
}