我在网站上发出请求,我想返回3个字符串,但是我得到了这个问题:
元组类型'(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
}
答案 0 :(得分:4)
您的代码中包含错误。如果仔细观察,你会从一个封闭内部返回,它需要返回值Void。这就是错误所在,
'(StringLiteralConvertible, StringLiteralConvertible, StringLiteralConvertible)' and '()'
类型'()'表示它是预期的void类型。
那么,你的错误在哪里,
在dataTaskWithURL方法中,闭包看起来像这样,
{ (data, response, error) -> Void in
if error != nil{
print(error?.localizedDescription)
return ("","","")
}
}
闭包期望返回Void类型,但是返回string的元组。
上面代码的一个坏处是关于异步代码执行。 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 :(得分: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()
}
答案 2 :(得分:1)
语句return ("","","")
从闭包中返回而不是从downloadContent()
函数返回。
由于闭包定义声明了Void
- 即:()
- 返回类型,编译器会使用您收到的错误消息进行抱怨。