(Swift)String如果不能转换为void

时间:2015-07-28 11:52:50

标签: swift http get request

我正在尝试创建一个http-get-request函数但它现在仍在工作。 http://i.stack.imgur.com/8hge2.png

但如果我喜欢那里,函数会返回一个空结果

http://i.stack.imgur.com/CTCt4.png

这有什么问题?

2 个答案:

答案 0 :(得分:1)

首先你要使用一个闭包,看看这个的含义:

 {()->void in 
   return // the closure returns a void
 }

您正在使用异步请求,因此您需要执行回调功能。

如果您熟悉javascript,我认为this是关于异步如何工作的一个很好的解释。

答案 1 :(得分:1)

您正在调用的函数具有以下原型:

func dataTaskWithRequest(
    _ request: NSURLRequest, 
    completionHandler completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void
) -> NSURLSessionDataTask?

这意味着completionHandler关闭不必返回一些东西。所以它是正常的,它告诉你String不能转换为Void。

你期望的是调用一个同步方法,期望它在内部异步调用完成时返回。这是可能的,但我不认为这是你想要的方式(可能会阻止用户界面)。

如果您希望此代码按照我认为您希望它运行的方式运行,您需要更改httpGet:以便能够传递一个将由dataTaskWithRequest的completionHandler调用的completionHandler。

像这样:

func httpGet(url: String, completion: String -> Void) {
    var googleUrl = NSURL(string: url)
    var request = NSMutableURLRequest(URL: googleUrl!)

    request.HTTPMethod = "GET"
    request.addValue("text/html", forHTTPHeaderField: "Content-Type")

    var session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error in
        if error != nil {
            println(error.localizedDescription)
        }

        completion(NSString(data: data, encoding: NSUTF8StringEncoding) as! String)
    })

    task.resume()
}

请注意这段代码根本不安全(强制解包和检查太少),但它总结了你应该如何构建代码。

要在某处使用它,您可以执行以下操作:

让我们想象你有一个标签出口。

httpGet("http://someurl.com") { result in
    label.text = result
}

async调用完成后,将立即设置label的text属性。