‘? 不能转换为” – > 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!)") }