“[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!)")
}