设置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
}
}
}
我得到了错误:
由于内部保护级别,无法访问“值”
答案 0 :(得分:4)
感谢您尝试Alamofire 5!这个错误有点令人误解,因为Swift编译器试图提供帮助,并让您知道internal
上有一个value
属性response.result
,您无法访问。但是,这是内部的Alamofire扩展,因为我们在Alamofire 5 beta 4中移至了Result
type provided by the Swift standard library。系统Result
不提供value
和error
属性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): ...
}
或者您可以在自己的项目中进行类似的扩展。他们将不再公开提供扩展程序。