'[CLPlacemark]?不能转换为'[CLPlacemark]' - > swift2

时间:2015-06-18 19:11:20

标签: ios xcode 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]'

4 个答案:

答案 0 :(得分:4)

在将地标数组分配给某种类型的[CLPlacemarks]

之前,您需要打开地标数组(隐式或可选链接)

对于您的示例,您应该使用可选链接

if let validPlacemark = placemarks?[0]{
     let placemark = validPlacemark as? CLPlacemark;
}

将所有逻辑放在大括号内,如果找到有效的地标数组,它将执行所需的命令。如果没有,它将什么都不做,或者你可以随意处理它

答案 1 :(得分:0)

地方标记不保证有值,您可以这样做:

let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []

其中读为,

如果placemarks可以投放为[CLPlacemark],那么就这样做。否则,指定一个空数组。

以下是实践中的代码:

enter image description here

我现在意识到您已经使用Xcode 7了!它在那里变得更加容易,您只需要:

let placeArray = placemarks ?? []

答案 2 :(得分:0)

在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; }
    // ...
}

答案 3 :(得分:0)

if let pm = placemarks?[0]{
     // Example: get the country
     print("Your country: \(pm.country!)")
}