我遇到此错误,并且我知道此问题已在此之前解决,因为人们没有在函数中添加return->。我不明白为什么这仍然给我错误。
void函数中意外的非void返回值
我正在尝试返回一个名为message的字符串。
func ParseIt(proURL: String, startStr: String, stopStr: String) -> String {
let url = URL(string: "https://www.siteimfetchingfrom.com/827444000973")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print(error)
} else {
let htmlContent = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
//print(htmlContent)
// Get all Product Info
//var proName = "id=\"productName\" value=\""
if let contentArray = htmlContent?.components(separatedBy: startStr) {
//print(contentArray)
if contentArray.count > 0 {
//proName = "\" required"
let newContentArray = contentArray[1].components(separatedBy: stopStr)
if newContentArray.count > 0 {
let message = newContentArray[0]
//print(newContentArray)
print(newContentArray[0])
return message // Error happens Here
}
}
}
}
}
task.resume()
}
答案 0 :(得分:3)
第return message
行写在闭包内部。在闭包内部编写的return语句将从闭包而不是周围的函数中返回。
要查看如何执行Web请求并获得响应,您应该使用完成处理程序而不是return
。您不能立即从ParseIt
返回一个字符串,因为请求将花费时间。
// notice the extra completion parameter and the removal of the return type
func ParseIt(proURL: String, startStr: String, stopStr: String, completion: @escaping (String) -> Void) {
let url = URL(string: "https://www.siteimfetchingfrom.com/827444000973")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
...
// replace the return statement with this:
completion(message)
}
task.resume()
}
您可以这样称呼它:
ParseIt(proURL: ..., startStr: ..., stopStr: ...) {
result in
// do something with "result"
}
答案 1 :(得分:1)
仔细查看您的return语句所属的位置。它不是从ParseInt
返回,实际上是从传递给URLSession.shared.dataTask
的完成闭包中返回。该完成处理程序的返回类型为void
。
func dataTask(带有请求:URLRequest,completionHandler:@escaping (数据?URLResponse?错误?)->无效)-> URLSessionDataTask