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 方面保护您:
- 如果
placeMarkAddress
是 nil
, 可选链 placemarkAddress?["Street"]
将 return nil
,optional cast as? String
会将 nil
转换为具有 nil
值的 String?
,而 ??
会将其替换为空字符串 ""
.
- 如果
"Street"
不是字典中的有效键,placeMarkAddress?["Street"]
将 return nil
并将转换为 ""
,如中所述第 1 点。
- 如果对应于键
"Street"
的字典中的值具有 String
以外的类型,则 条件转换 将 return String?
的值为 nil
,??
将转换为 ""
。
- 最后,使用 nil 合并运算符
??
安全地从字典中解包值,如果它存在并且是 String
,否则它替换提供的默认值(空 String
""
)。
我已升级到 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
.
nil
不是显式检查 nil
并使用 ? :
运算符替代 ""
,而是有一个特殊的运算符来执行此操作,称为 nil 合并运算符 ??
是这样使用的:
let street = placeMarkAddress?["Street"] as? String ?? ""
以这种方式编写声明可以在 4 方面保护您:
- 如果
placeMarkAddress
是nil
, 可选链placemarkAddress?["Street"]
将 returnnil
,optional castas? String
会将nil
转换为具有nil
值的String?
,而??
会将其替换为空字符串""
. - 如果
"Street"
不是字典中的有效键,placeMarkAddress?["Street"]
将 returnnil
并将转换为""
,如中所述第 1 点。 - 如果对应于键
"Street"
的字典中的值具有String
以外的类型,则 条件转换 将 returnString?
的值为nil
,??
将转换为""
。 - 最后,使用 nil 合并运算符
??
安全地从字典中解包值,如果它存在并且是String
,否则它替换提供的默认值(空String
""
)。