Ios 作为单独的函数从URL获取数据

Ios 作为单独的函数从URL获取数据,ios,swift,function,Ios,Swift,Function,我尝试创建从URL获取数据的函数: func getStringFromUrl(urlString: String) -> String { if let requestURL = URL(string: urlString) { let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: requ

我尝试创建从URL获取数据的函数:

func getStringFromUrl(urlString: String) -> String {
    if let requestURL = URL(string: urlString) {
        let session = URLSession(configuration: URLSessionConfiguration.default)
        let task = session.dataTask(with: requestURL, completionHandler: { (data, response, error) in
            if let data = data {
                do {
                    let str = String(data: data, encoding: String.Encoding.utf8)
                    return str
                }
                catch let error as NSError {
                    print ("error = \(error)")
                }

            }
            else {
               print ("error = \(error)")
            }
        })
        task.resume()
    }
}
但我得到了这个错误:void函数中意外的非void返回值

如何创建一个单独的函数来从Url获取数据?

在您的代码中,您有:

let str = String(data: data, encoding: String.Encoding.utf8)
return str
它位于未定义为返回任何内容的闭包块内。因为函数session.dataTask是一个异步任务,所以它不会立即返回。当响应返回时,应该使用完成块/闭包来获取响应。还要记住,它可能不会返回,因此字符串需要是可选的。请参阅下面的代码

func getStringFromUrl(urlString: String, completion: @escaping (_ str: String?) -> Void) {
    if let requestURL = URL(string: urlString) {
        let session = URLSession(configuration: URLSessionConfiguration.default)
        let task = session.dataTask(with: requestURL, completionHandler: { (data, response, error) in
            if let data = data {
                do {
                    let str = String(data: data, encoding: String.Encoding.utf8)
                    completion(str)
                }
                catch let error as NSError {
                    print ("error = \(error)")
                    completion(nil)
                }

            }
            else {
                print ("error = \(error)")
                completion(nil)
            }
        })
        task.resume()
    }
}
编辑:用法

getStringFromUrl(urlString: "http://google.com") { str in 
   if let text = str {
       // you now have string returned
   }
}

从街区,你不能回来。相反,您必须使用完成手册我更新了答案,此问题已标记为重复,因此重复的问题也应回答并告诉您这一点