xcode 7 Beta 6 中对地标 addressDictionary 的更改

Changes to placemark addressDictionary in xcode 7 Beta 6

我已升级到 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 开发仍然是个新手。

因为placeMarkAddress[NSObject: AnyObject]?,你必须在使用前打开它。可选的链接 ? 在这里是合适的;如果字典不是 nil,它将打开字典;如果字典是 nil.

,它将安全地 return nil

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

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

以这种方式编写声明可以在 4 方面保护您:

  1. 如果 placeMarkAddressnil 可选链 placemarkAddress?["Street"] 将 return niloptional cast as? String 会将 nil 转换为具有 nil 值的 String?,而 ?? 会将其替换为空字符串 "".
  2. 如果 "Street" 不是字典中的有效键,placeMarkAddress?["Street"] 将 return nil 并将转换为 "",如中所述第 1 点。
  3. 如果对应于键 "Street" 的字典中的值具有 String 以外的类型,则 条件转换 将 return String? 的值为 nil?? 将转换为 ""
  4. 最后,使用 nil 合并运算符 ?? 安全地从字典中解包值,如果它存在并且是 String,否则它替换提供的默认值(空 String "")。