2014-08-30 82 views
6

如何将(NSObject, AnyObject)类型的对象转换为String类型的对象?'(NSObject,AnyObject)'不能转换为'字符串'

在下面的方法的第一行的末尾,as String使编译器错误:

'(NSObject, AnyObject)' is not convertible to 'String' 

铸造streetNSString而不是String编译,但我铸造streetString因为我想将其与placemark.name进行比较,其类型为String!,而不是NSString

我知道namestreet是自选的,但我假设他们不是nil现在,因为所有的地方从MKLocalSearch返回似乎有非空的名称和街道。

func formatPlacemark(placemark: CLPlacemark) -> (String, String) { 
    let street = placemark.addressDictionary["Street"] as String 
    if placemark.name == street { 
     // Do something 
    } 
} 

回答

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 

,但它不买,你在这种情况下,任何东西。

+0

你怎么知道我可以做'地标'。name == street'而不是'street.isEqualToString(placemark.name)'?我想确保我正在检查字符串相等('isEqualToString'),而不是对象身份('==')。 – ma11hew28 2014-08-30 16:10:50

+0

Swift自动在这两种类型之间进行桥接,'=='是测试字符串相等的Swift方法。请参阅:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html – vacawama 2014-08-30 16:21:43

+0

在操场上试试。你会看到它的作品,只要你愿意。在游乐场 – vacawama 2014-08-30 16:24:42

1

我认为这可能与addressDictionaryNSDictionary有关。

如果您将addressDictionary转换为Swift字典,它应该可以工作。

let street = (placemark.addressDictionary as Dictionary<String, String>)["String"] 
+0

但是,这比[@ vacawama的解决方案](http://stackoverflow.com/a/25582668/242933)慢?因为不是'Dictionary'完全不同于'NSDictionary'吗?那么,这是否意味着将'NSDictionary'转换为'Dictionary',程序将不得不创建一个全新的'Dictionary'对象,并使用原始'NSDictionary'的键和值填充它?这听起来更像是一个简单的演员。 – ma11hew28 2014-08-30 16:14:51

+0

这不安全。如果字典中的任何值都是“NSString”以外的对象,则会导致应用程序崩溃。如果你100%确定所有的对象都是'NSString',那么你只能这样做,然后在数据第一次创建时只做一次。如果你在应用程序的外部调用一个API来获取'NSDictionary',那么使用类型转换运算符('as?')的可选形式检查每个对象会更安全。 – vacawama 2014-08-30 19:41:04

2

通过下标查找swift字典的返回类型必须是可选的,因为给定的键可能没有值。

为此,你必须做到:

as String? 
+1

'as String?'给出相同的编译器错误。 – ma11hew28 2014-08-30 16:04:53