2014-08-30 104 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