【问题标题】:'[CLPlacemark]?' is not convertible to '[CLPlacemark]' -> swift2'[CLPplacemark]?不能转换为 '[CLPlacemark]' -> swift2
【发布时间】:2015-06-18 19:11:20
【问题描述】:

这是我在 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]'

【问题讨论】:

    标签: ios xcode swift2


    【解决方案1】:

    看起来您需要先解开地标数组(隐式或可选链接),然后再将其分配给 [CLPlacemarks] 类型

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

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

    将所有逻辑放在大括号内,这样如果它找到一个有效的地标数组,它将执行你想要的命令。如果没有,它什么也不做,或者你可以随心所欲地处理它

    【讨论】:

    • 仍然返回错误。不能为“[CLPlacemark] 类型的值下标?”索引类型为“Int”
    • 仍然无法正常工作:/'CLPlacemark?不能转换为“CLPlacemark”
    • 现在出现警告“从 'CLPlacemark' 强制转换为 'CLPlacemark' 总是成功;您的意思是使用 'as' 吗?”看起来更好,但警告是未来的错误:)
    • 是的!对此感到抱歉,我面前没有操场来快速测试它
    • 那我该怎么办?为了删除这个警告:)
    【解决方案2】:

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

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

    读作,

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

    这是实践中的代码:

    我现在意识到您使用的是 Xcode 7!那里更容易,你只需要这个:

    let placeArray = placemarks ?? []
    

    【讨论】:

    • 这仍然返回错误。来自“[CLPlacemark]?”的垂头丧气到 '[CLPlacemark]' 只解开可选项;您的意思是使用“!”吗?
    • @VivienG - 我刚刚意识到你正在使用新的测试版!请参阅底部更新,因为针对数组类型更新了 Objective-C 泛型,您可以更轻松地进行操作!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      if let pm = placemarks?[0]{
           // Example: get the country
           print("Your country: \(pm.country!)")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        相关资源
        最近更新 更多