2016-03-03 96 views
0

(我是一般的Swift和iOS開發新手)。在Swift中讀取NSNotification userInfo

我移植一些Objective-C代碼交給斯威夫特,我不知道如何翻譯這個:

-(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被聲明爲NSDictionaryUIApplicationShortcutItem.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's Dictionary不像NSDictionary那樣寬鬆,所以您需要使用as?來確保該值如您所期望的那樣爲Foo實例。

您不能直接爲可選字典下標,但如果您使用? for optional chaining,則可以在字典非零時訪問該值。如果不是零,我還建議if let訪問最終值。 (或者你可以選擇的情況下,使用guard letfatalErrorreturn的富不存在。)

if let foo = notification.userInfo?[BarKey] as? Foo { 
    // foo is non-nil (type `Foo`) in here 
}