2016-03-03 2 views
0

(Я новичок в разработке Swift и iOS в целом).Чтение NSNotification userInfo в Swift

Я портирования некоторые Objective-C код к Swift, и я не знаю, как перевести это:

-(void) fooDidBar:(NSNotification *)notification 
{ 
    Foo* foo = [[notification userInfo] objectForKey:BarKey]; 
    // do stuff with foo 
} 

До сих пор у меня есть это:

private func fooDidBar(notification: NSNotification) { 
    var foo: Foo = notification.userInfo.objectForKey(BarKey) 
} 

Но я получаю ошибка компиляции:

/Users/me/src-me/project/FooBarViewController.swift:53:57: Value of type '[NSObject : AnyObject]?' has no member 'objectForKey'

в userInfo объявлен как NSDictionary в UIApplicationShortcutItem.h:

@property (nullable, nonatomic, copy) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo; 

... Я думал, что попробовать это:

= notification.userInfo[BarKey] 

, но затем я получаю эту ошибку:

/Users/me/src-me/project/FooBarViewController.swift:53:65: Type '[NSObject : AnyObject]?' has no subscript members

ответ

0

Ваша идея использовать подстрочные была правильной, однако как вы можете видеть по наличию ?, словарь userInfo равен Optional, что означает, что он может быть равен нулю (в Objective-C не проводится никакого различия). Кроме того, Словарь Swift не так мягко относится к типам NSDictionary, поэтому вам нужно будет использовать as?, чтобы убедиться, что значение является экземпляром Foo, как вы ожидаете.

Вы не можете напрямую индексировать дополнительный словарь, но если вы используете ? for optional chaining, вы можете получить доступ к значению, если словарь не равен нулю. Я бы также рекомендовал if let получить доступ к окончательному значению, если он не равен нулю. (Или вы можете выбрать, чтобы использовать guard let с fatalError или return в случае Foo нет.)

if let foo = notification.userInfo?[BarKey] as? Foo { 
    // foo is non-nil (type `Foo`) in here 
} 
Смежные вопросы