这是我在StackOverflow上找到的代码的一部分 它在Swift 1.2中工作 为什么这段代码在swift 2中不再起作用了:
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
let placeArray = placemarks as [CLPlacemark] // !!! ERROR HERE !!!
// Place details
var placeMark: CLPlacemark!
placeMark = placeArray[0]
// Address dictionary
print(placeMark.addressDictionary)
// Location name
if let locationName = placeMark.addressDictionary["Name"] as? NSString {
print(locationName)
}
// Street address
if let street = placeMark.addressDictionary["Thoroughfare"] as? NSString {
print(street)
}
// City
if let city = placeMark.addressDictionary["City"] as? NSString {
print(city)
}
// Zip code
if let zip = placeMark.addressDictionary["ZIP"] as? NSString {
print(zip)
}
// Country
if let country = placeMark.addressDictionary["Country"] as? NSString {
print(country)
}
})
错误是GetLocationViewController.swift:67:41:'[CLPlacemark]?' is not convertible to '[CLPlacemark]'
答案 0 :(得分:4)
在将地标数组分配给某种类型的[CLPlacemarks]
之前,您需要打开地标数组(隐式或可选链接)对于您的示例,您应该使用可选链接
if let validPlacemark = placemarks?[0]{
let placemark = validPlacemark as? CLPlacemark;
}
将所有逻辑放在大括号内,如果找到有效的地标数组,它将执行所需的命令。如果没有,它将什么都不做,或者你可以随意处理它
答案 1 :(得分:0)
地方标记不保证有值,您可以这样做:
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []
其中读为,
如果placemarks
可以投放为[CLPlacemark]
,那么就这样做。否则,指定一个空数组。
以下是实践中的代码:
我现在意识到您已经使用Xcode 7了!它在那里变得更加容易,您只需要:
let placeArray = placemarks ?? []
答案 2 :(得分:0)
在Xcode 7.0中,Objective-C具有通用数组,因此placemarks
数组不再是[AnyObject]?
,而是[CLLocation]?
。您不需要强制转换数组,只需打开可选项即可。通过添加保护语句,您的完成块现在非常简单:
geocoder.reverseGeocodeLocation(location) { placemarks, error in
guard let placemarks = placemarks else { print(error); return; }
guard let placemark = placemarks.first else { return; }
// ...
}
答案 3 :(得分:0)
if let pm = placemarks?[0]{
// Example: get the country
print("Your country: \(pm.country!)")
}