'[CLPlacemark]?'无法转换为'[CLPlacemark]' -> Swift2

3

这是我在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]?'无法转换为 '[CLPlacemark]'

4个回答

4

看起来你需要在将它赋给 [CLPlacemarks] 类型之前,对 placemarks 数组进行展开 (隐式或可选链)。

对于你的示例,你应该使用可选链,因此

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

然后将所有逻辑放在花括号内,如果找到有效的标记数组,则执行所需的命令。否则,它将不执行任何操作,或者您可以按照自己的方式处理它。


仍然无法工作:/ 'CLPlacemark?' 无法转换为 'CLPlacemark' - VivienG
现在出现一个警告: "从 'CLPlacemark' 强制转换为 'CLPlacemark' 总是成功;你是否想使用 'as'?"看起来更好,但警告可能会成为未来的错误 :) - VivienG
是的!非常抱歉,我手头没有游乐场可以快速测试它。 - Josh Hamet
我的新编辑是否有效?你可以使用“as?”来检查是否为空,以确保它被解包,或者我更喜欢使用可选链。 - Josh Hamet
仍然不是 :/ “从'CLPlacemark'到'CLPlacemark'的条件转换总是成功”的警告。 - VivienG
显示剩余5条评论

0

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

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

这段代码的意思是:

如果 placemarks 可以转换为 [CLPlacemark],那么就转换。否则,赋值为空数组。

以下是这段代码的实际应用:

enter image description here

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

let placeArray = placemarks ?? []

这仍然返回一个错误。从“[CLPlacemark]?”向“[CLPlacemark]”的下转换仅取消可选项;您是否意味着使用“!”? - VivienG
@VivienG - 我刚意识到你正在使用新的测试版!请看底部更新,由于Objective-C泛型已经针对数组类型进行了更新,因此您甚至可以更轻松地完成它! - Logan

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接