(Swift)字符串,如果不能转换为无效

(Swift)字符串,如果不能转换为无效,swift,http,get,request,Swift,Http,Get,Request,我正在尝试创建一个http get请求函数,但它现在仍在工作。 但如果我喜欢这里,函数将返回一个空结果 这有什么不对?首先,你要使用闭包,看看它的意思: {()->void in return // the closure returns a void } 您使用的是异步请求,因此需要执行回调函数 如果您熟悉javascript,我认为这是关于异步如何工作的一个很好的解释。您正在调用的函数具有以下原型: func dataTaskWithRequest( _ req

我正在尝试创建一个http get请求函数,但它现在仍在工作。

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


这有什么不对?

首先,你要使用闭包,看看它的意思:

 {()->void in 
   return // the closure returns a void
 }
您使用的是异步请求,因此需要执行回调函数


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

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

func dataTaskWithRequest(
    _ request: NSURLRequest, 
    completionHandler completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void
) -> NSURLSessionDataTask?
这意味着completionHandler闭包不必返回某些内容。所以说字符串不能转换为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
}

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

以纯文本形式发布代码。谢谢,我应该如何使用它?我试图用response=httpgeturl这样的语法使http请求调用变得简单,但实际上你不能这样做。我将通过编辑我的anwser向您展示如何使用它。请稍候。我明白了。最后一个问题:我在ViewController.swift的顶部声明了一个var res:String=。然后是httpGet函数,然后是-viewDidload操作,我在其中使用它httpGet2http://my1test.ru/applejesus.php?task=getCategoryCount {result in self.res=result}因此,我使用printlnres及其空值。但如果我打印结果-我看到我需要的答案12。我做错了什么?@swifftstudier你真的应该更多地了解异步的工作原理。如果你从未使用过异步,那么很难理解它。你做得对。如果需要viewDidLoad中的值,只需将代码放入闭包中即可。如果您以后需要它,您可以像以前那样存储它,但它只有在异步调用结束时才可用。