2015-08-28 6 views
2

Я обновился до xcode 7 beta 6, так как скоро появится iOS 9. Я был очень рад, что мой код конвертирован без лишних хлопот, за исключением одного исключения.Изменения в адресной книжкеDictionary в xcode 7 Beta 6

похоже, что 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]?

Как получить значение (AnyObject) по ссылке NSObject по названию?

Я попытался это в 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. Если placeMarkAddress является nil, то опционального цепьplacemarkAddress?["Street"] вернется nil, то опциональные литойas? String повернет, что nil в String? со значением nil и ?? заменит, что с пустой строкой "".
  2. Если не является допустимым ключом в словаре, placeMarkAddress?["Street"] возвратит nil и будут преобразованы в "", как указано в пункте 1.
  3. Если значение в словаре, соответствующий ключ имеет тип, отличный от String , то условное литье вернет String? со значением nil, которое ?? будет конвертировать в "".
  4. Наконец, используя ноль сливающихся оператора?? безопасно разворачивает значение из словаря, если она существует и является String, в противном случае он заменяет значение по умолчанию, (пустой String"").
+0

Благодарим за это. Я понимаю концепцию развертывания, но временами она несколько абстрагируется и время от времени ловит меня. Я думал, что попробовал это, но, очевидно, я этого не сделал. –

+0

В дизайне Swift много мудрости, но обработка опций требует практики. – vacawama

+0

У меня есть этот код: if let address = placeMark.addressDictionary? ["FormattedAddressLines"] [0]? в виде? Строка , и я получаю ту же ошибку. –