2015-08-28 28 views
2

我已經升級到xcode 7 beta 6,因爲iOS 9將很快應用於我們。除了一個例外,我很高興我的代碼轉換時沒有太多麻煩。xcode 7 Beta 6中對地標addressDictionary的更改

看來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開發的新手。

回答

3

由於placeMarkAddress[NSObject: AnyObject]?,因此在使用之前必須先打開包裝。可選的鏈接?在這裏是合適的;如果它不是nil,它將打開字典,或者如果字典是nil,它將安全地返回nil

而是明確檢查nil和使用? :操作替代""的,有一個特殊的經營者要做到這一點叫零合併運算??它這樣使用:

let street = placeMarkAddress?["Street"] as? String ?? "" 

用這種方式書寫聲明以4種方式保護您:

  1. 如果placeMarkAddressnil,則可選鏈placemarkAddress?["Street"]將返回nil,則可選投as? String會變成那個nilString?nil值,??將取代與空字符串""
  2. 如果不在字典中的有效密鑰,placeMarkAddress?["Street"]將返回nil並且如在點1
  3. 指出,將被轉換爲""如果在對應於key 字典中的值具有比String其它類型,那麼有條件轉換將返回值爲nilString?,其中??將轉換爲""
  4. 最後,使用零聚結操作者??如果存在,是一個String安全地解開從字典的值,否則它可以代替所提供的默認值(空String"")。
+0

感謝您的支持。我理解展開的概念,但有時會感覺有些抽象,並且偶爾會讓我感到不安。我以爲我試過這個,但顯然我沒有。 –

+0

在Swift的設計中有許多智慧,但處理選項確實需要練習。 – vacawama

+0

我有這個和平的代碼: 如果讓地址= placeMark.addressDictionary?[「FormattedAddressLines」] [0]?如?字符串 和我得到相同的錯誤。 –