由于“内部”保护级别,无法访问“值”

时间:2019-04-02 23:05:31

标签: swift alamofire

设置openweathermap的API。但是,在设置时:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location  = locations[0]
        lat = location.coordinate.latitude
        lon = location.coordinate.longitude
        AF.request("http://api.openweathermaps.org/data/2.5/weather?lat=\(lat)&lon=\(lon)&appid=\(apiKey)&units=metric").responseJSON {
            response in
            self.activityIndicator.stopAnimating()
            if let responseStr = response.result.value {
                let jsonResponse = JSON(responseStr)
                let jsonWeather  = jsonResponse["weather"].array![0]
                let jsonTemp = jsonResponse["main"]
                let iconName =  jsonWeather["icon"].stringValue
            }
        }

    }

我得到了错误:

  由于内部保护级别,无法访问

“值”

3 个答案:

答案 0 :(得分:4)

感谢您尝试Alamofire 5!这个错误有点令人误解,因为Swift编译器试图提供帮助,并让您知道internal上有一个value属性response.result,您无法访问。但是,这是内部的Alamofire扩展,因为我们在Alamofire 5 beta 4中移至了Result type provided by the Swift standard library。系统Result不提供valueerror属性Alamofire先前提供的Result类型可以。因此,尽管我们内部有一些扩展可以为我们提供功能,但它们并不公开存在供您的应用使用。

最终的解决方案取决于您。您可以自己扩展Result来提供属性(随意使用Alamofire实现),也可以不使用属性而在switch上添加response.result来提取响应值。我建议暂时使用switch,因为它会迫使您考虑.failure的情况。

答案 1 :(得分:1)

switch response.result {
        
        case .success(let value):
            print("Alamo value: \(value)")
            break
        case .failure(let error):
            print("Alamo error: \(error)")
            break
        }

答案 2 :(得分:0)

在最新的beta 4版本中,Alamofire切换为使用新的标准Result类型,因此我们以前的便捷属性已设置为内部属性。现在,您可以像这样切换结果:

switch response.result {
    case let .success(value): ...
    case let .failure(error): ...
}

或者您可以在自己的项目中进行类似的扩展。他们将不再公开提供扩展程序。