如何将(NSObject, AnyObject)
类型的对象转换为String
类型?
在下面方法的第一行末尾,as String
导致编译器错误:
'(NSObject, AnyObject)' is not convertible to 'String'
将street
转换为NSString
而不是String
编译,但我将street
转换为String
,因为我想将其与{{1}进行比较}},其类型为placemark.name
,而非String!
。
我知道NSString
和name
是可选项,但我认为它们现在不是street
,因为从nil
返回的所有地点似乎都是非 - 名字和街道。
MKLocalSearch
答案 0 :(得分:6)
String
不是对象,因此您需要将其强制转换为NSString
。我建议使用以下语法来强制转换它并同时解开它。不要担心将它与String!
类型的变量进行比较,因为它们是兼容的。这将有效:
func formatPlacemark(placemark: CLPlacemark) -> (String, String) {
if let street = placemark.addressDictionary["Street"] as? NSString {
if placemark.name == street {
// Do something
}
}
}
这具有额外的好处,如果“街道”不是您字典中的有效密钥,或者如果对象类型不是NSString
,则不会崩溃。它只是不会进入区块。
如果您真的希望街道成为String
,您可以这样做:
if let street:String = placemark.addressDictionary["Street"] as? NSString
但在这种情况下它不会给你买任何东西。
答案 1 :(得分:2)
通过查找swift字典的下标返回类型必须是可选的,因为给定键可能没有值。
因此你必须这样做:
as String?
答案 2 :(得分:1)
我认为这可能与addressDictionary
成为NSDictionary
。
如果您将addressDictionary
转换为Swift词典,它应该可以正常工作。
let street = (placemark.addressDictionary as Dictionary<String, String>)["String"]