这是我在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]'
发布于 2015-06-18 19:37:18
看起来,在将placemarks数组分配给一种CLPlacemarks类型之前,您需要先展开placemarks数组(隐式或可选链)。
对于您的例子,您应该使用可选的链接
if let validPlacemark = placemarks?[0]{
let placemark = validPlacemark as? CLPlacemark;
}而不是将所有的逻辑放在大括号中,这样如果它找到一个有效的placemark数组,它将执行您想要的命令。如果没有,它就什么也做不了,或者你可以随意处理。
发布于 2015-06-18 19:40:12
placemarks不能保证有一个值,您可以这样做:
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []上面写着,
如果placemarks可以转换为[CLPlacemark],那么就这样做。否则,分配一个空数组。
下面是实践中的代码:

我现在意识到你在使用Xcode 7!更简单的是,你所需要的就是:
let placeArray = placemarks ?? []发布于 2015-06-18 21:43:43
在Xcode 7.0中,Objective有泛型数组,因此您的placemarks数组不再是[AnyObject]?,而是[CLLocation]?。您不需要强制转换数组,只需打开可选的包即可。添加了守护语句后,您的完成块现在就很简单了:
geocoder.reverseGeocodeLocation(location) { placemarks, error in
guard let placemarks = placemarks else { print(error); return; }
guard let placemark = placemarks.first else { return; }
// ...
}https://stackoverflow.com/questions/30923810
复制相似问题