NSURLSession返回元组的问题

时间:2015-08-28 09:40:39

标签: ios xcode swift swift2

我在网站上发出请求,我想返回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
}

3 个答案:

答案 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 - 即:() - 返回类型,编译器会使用您收到的错误消息进行抱怨。