首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“[CLPlacemark]?”不可转换为“[CLPlacemark]”-> swift2

“[CLPlacemark]?”不可转换为“[CLPlacemark]”-> swift2
EN

Stack Overflow用户
提问于 2015-06-18 19:11:20
回答 4查看 2.5K关注 0票数 3

这是我在StackOverflow上找到的代码的一部分。

它是在Swift 1.2中工作的,为什么这段代码在swift 2中不再工作了:

代码语言:javascript
复制
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]'

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-18 19:37:18

看起来,在将placemarks数组分配给一种CLPlacemarks类型之前,您需要先展开placemarks数组(隐式或可选链)。

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

代码语言:javascript
复制
if let validPlacemark = placemarks?[0]{
     let placemark = validPlacemark as? CLPlacemark;
}

而不是将所有的逻辑放在大括号中,这样如果它找到一个有效的placemark数组,它将执行您想要的命令。如果没有,它就什么也做不了,或者你可以随意处理。

票数 4
EN

Stack Overflow用户

发布于 2015-06-18 19:40:12

placemarks不能保证有一个值,您可以这样做:

代码语言:javascript
复制
let placeArray: [CLPlacemark] = placemarks as? [CLPlacemark] ?? []

上面写着,

如果placemarks可以转换为[CLPlacemark],那么就这样做。否则,分配一个空数组。

下面是实践中的代码:

我现在意识到你在使用Xcode 7!更简单的是,你所需要的就是:

代码语言:javascript
复制
let placeArray = placemarks ?? []
票数 0
EN

Stack Overflow用户

发布于 2015-06-18 21:43:43

在Xcode 7.0中,Objective有泛型数组,因此您的placemarks数组不再是[AnyObject]?,而是[CLLocation]?。您不需要强制转换数组,只需打开可选的包即可。添加了守护语句后,您的完成块现在就很简单了:

代码语言:javascript
复制
geocoder.reverseGeocodeLocation(location) { placemarks, error in
    guard let placemarks = placemarks else { print(error); return; }
    guard let placemark = placemarks.first else { return; }
    // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30923810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档