我已升级到 xcode 7 beta 6,因为 iOS 9 即将推出。我很高兴我的代码转换没有太多麻烦,除了一个异常(exception)。
似乎placemark.addressDictionary
已更改为[NSObject: AnyObject]
?
这是我在 xCode 6 中用于 map 搜索的代码
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"]
将返回nil
,可选转换为? String
会将nil
转换为具有nil
值的String?
,并且??
将将其替换为空字符串""
。 - 如果
"Street"
不是字典中的有效键,placeMarkAddress?["Street"]
将返回nil
,这将如第 1 点所述转换为""
。 - 如果字典中与键
"Street"
对应的值的类型不是String
,则条件转换将返回String?
的值为nil
,??
将转换为""
。 - 最后,如果该值存在并且是一个
String
,则使用 nil 合并运算符??
安全地从字典中解包该值,否则它替换提供的默认值(空String
""
)。
关于ios - xcode 7 Beta 6 中地标地址字典的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267726/