函数返回时出现非空错误

时间:2019-02-14 07:34:01

标签: swift

我遇到此错误,并且我知道此问题已在此之前解决,因为人们没有在函数中添加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()
    }

2 个答案:

答案 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