【问题标题】:Changes to placemark addressDictionary in xcode 7 Beta 6xcode 7 Beta 6 中地标地址字典的更改
【发布时间】:2015-08-28 09:28:12
【问题描述】:

我已升级到 xcode 7 beta 6,因为 iOS 9 即将推出。我很高兴我的代码转换没有太多麻烦,除了一个例外。

好像placemark.addressDictionary改成[NSObject: AnyObject]了?

这是我在 xCode 6 中用于地图搜索的代码

for item in response.mapItems as! [MKMapItem] {
     var placeMarkAddress = item.placemark.addressDictionary
     let street:String = placeMarkAddress["Street"] != nil ? placeMarkAddress["Street"] as! String : ""
}

这不再适用于 placeMarkAddress 现在是 [NSObject: AnyObject]

如何通过按名称引用 NSObject 来获取值 (AnyObject)?

我在 xcode7 中试过这个

 for item in response!.mapItems {
     var placeMarkAddress = item.placemark.addressDictionary
     for placeMarkAddress in placeMarkAddresses!{
          print(placeMarkAddress)
     }
 }

我得到的输出是这样的。

 (FormattedAddressLines, [440 Castro St, San Francisco, CA  94114-2020, United States])
 (Street, 440 Castro St)
 (SubAdministrativeArea, San Francisco)
 (Thoroughfare, Castro St)
 (ZIP, 94114)
 (Name, 440 Castro)
 (City, San Francisco)
 (PostCodeExtension, 2020)
 (Country, United States)
 (State, CA)
 (SubLocality, Castro)
 (SubThoroughfare, 440)
 (CountryCode, US)

这对你们中的一些人来说可能很明显,但我还是 iOS 开发的新手。

【问题讨论】:

    标签: ios swift swift2 xcode7


    【解决方案1】:

    由于placeMarkAddress[NSObject: AnyObject]?,因此您必须在使用前打开它。可选的链接? 在这里是合适的;如果字典不是nil,它将解开字典,如果字典是nil,它将安全地返回nil

    不是显式检查nil 并使用? : 运算符来替换"",而是使用一个特殊的运算符来执行此操作,称为nil 合并运算符 ??像这样:

    let street = placeMarkAddress?["Street"] as? String ?? ""
    

    以这种方式编写声明可以通过 4 种方式保护您:

    1. 如果placeMarkAddressnil,则可选链 placemarkAddress?["Street"] 将返回nil可选转换 as? String 将转为nil到带有 nil 值的 String? 中,?? 将用空字符串 "" 替换它。
    2. 如果 "Street" 不是字典中的有效键,placeMarkAddress?["Street"] 将返回 nil 并将转换为 "",如第 1 点所述。
    3. 如果与键 "Street" 对应的字典中的值的类型不是 String,则 条件强制转换 将返回值为 nilString?,其中 @ 987654350@ 将转换为 ""
    4. 最后,使用 nil 合并运算符 ?? 安全地从字典中解包该值(如果它存在并且是 String),否则它会替换提供的默认值(空 String@ 987654355@)。

    【讨论】:

    • 谢谢。我理解展开的概念,但有时感觉有点抽象,时不时让我抓狂。我以为我已经尝试过了,但显然我没有。
    • 在 Swift 的设计中有很多智慧,但处理可选项确实需要练习。
    • 我有这样的代码:if let address=placeMark.addressDictionary?["FormattedAddressLines"][0]?作为?字符串,我得到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2015-11-19
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多