“[CLPlacemark]?”不能转换为'[CLPlacemark]' -> swift2
'[CLPlacemark]?' is not convertible to '[CLPlacemark]' -> swift2
这是我在 Whosebug 上找到的部分代码。
它在 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]'
在将地标数组分配给 [CLPlacemarks]
类型之前,您似乎需要解包地标数组(隐式或可选链接)
对于您的示例,您应该使用可选链接,因此
if let validPlacemark = placemarks?[0]{
let placemark = validPlacemark as? CLPlacemark;
}
然后将所有逻辑放在大括号内,这样如果它找到有效的地标数组,它就会执行你想要的命令。如果没有,它什么都不做,或者你可以随心所欲地处理它
placemarks 不能保证有值,你可以这样做:
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []
读作,
如果 placemarks
可以转换为 [CLPlacemark]
,那么就这样做。否则,分配一个空数组。
这是实践中的代码:
我现在意识到你在 Xcode 7!那里更简单,你只需要这个:
let placeArray = placemarks ?? []
在 Xcode 7.0 中,Objective-C 具有通用数组,因此您的 placemarks
数组不再是 [AnyObject]?
,而是现在的 [CLLocation]?
。你不需要转换数组,你可以解开可选的。通过添加 guard 语句,您的完成块现在非常简单:
geocoder.reverseGeocodeLocation(location) { placemarks, error in
guard let placemarks = placemarks else { print(error); return; }
guard let placemark = placemarks.first else { return; }
// ...
}
if let pm = placemarks?[0]{
// Example: get the country
print("Your country: \(pm.country!)")
}
这是我在 Whosebug 上找到的部分代码。
它在 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]'
在将地标数组分配给 [CLPlacemarks]
类型之前,您似乎需要解包地标数组(隐式或可选链接)对于您的示例,您应该使用可选链接,因此
if let validPlacemark = placemarks?[0]{
let placemark = validPlacemark as? CLPlacemark;
}
然后将所有逻辑放在大括号内,这样如果它找到有效的地标数组,它就会执行你想要的命令。如果没有,它什么都不做,或者你可以随心所欲地处理它
placemarks 不能保证有值,你可以这样做:
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []
读作,
如果 placemarks
可以转换为 [CLPlacemark]
,那么就这样做。否则,分配一个空数组。
这是实践中的代码:
我现在意识到你在 Xcode 7!那里更简单,你只需要这个:
let placeArray = placemarks ?? []
在 Xcode 7.0 中,Objective-C 具有通用数组,因此您的 placemarks
数组不再是 [AnyObject]?
,而是现在的 [CLLocation]?
。你不需要转换数组,你可以解开可选的。通过添加 guard 语句,您的完成块现在非常简单:
geocoder.reverseGeocodeLocation(location) { placemarks, error in
guard let placemarks = placemarks else { print(error); return; }
guard let placemark = placemarks.first else { return; }
// ...
}
if let pm = placemarks?[0]{
// Example: get the country
print("Your country: \(pm.country!)")
}