‘? 不能转换为” – > swift2
这是我在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]'
'[CLPlacemark]?' is not convertible to '[CLPlacemark]'
看起来你需要解开placemarks数组(隐式或可选链接),然后再将其分配给[CLPlacemarks]类型
对于您的示例,您应该使用可选链接
if let validPlacemark = placemarks?[0]{ let placemark = validPlacemark as? CLPlacemark; }
将所有逻辑放在大括号内,如果找到有效的地标数组,它将执行所需的命令。 如果没有,它将什么都不做,或者你可以随意处理它
地标不保证有值,你可以这样做:
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []
读作为,
如果placemarks
可以作为[CLPlacemark]
,则执行此操作。 否则,指定一个空数组。
这是实践中的代码:
我现在意识到你在使用Xcode 7! 它更容易,你需要的只是:
let placeArray = placemarks ?? []
在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; } // ... }
if let pm = placemarks?[0]{ // Example: get the country print("Your country: \(pm.country!)") }