在Swift中读取NSNotification userInfo

时间:2016-03-03 08:03:10

标签: ios objective-c swift cocoa-touch

(我是Swift和iOS开发的新手。)

我正在将一些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:类型'[NSObject:AnyObject]的值?'没有成员'objectForKey'

userInfoNSDictionary被声明为UIApplicationShortcutItem.h

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

......我以为我会试试这个:

= notification.userInfo[BarKey]

然后我收到了这个错误:

  

/Users/me/src-me/project/FooBarViewController.swift:53:65:输入'[NSObject:AnyObject]?'没有下标成员

1 个答案:

答案 0 :(得分:1)

您使用下标的想法是正确的,但是正如您可以看到?的存在,userInfo字典是Optional,这意味着它可以是nil(在Objective-中) C,没有区别)。此外,Swift的字典不像NSDictionary那样宽松,因此您需要使用as?来确保该值是您期望的Foo实例。

您无法直接下标可选字典,但如果您使用? for optional chaining,则可以在字典为非零时访问该值。我还建议if let访问最终值,如果它是非零的。 (或者,如果Foo不存在,您可以选择将guard letfatalErrorreturn一起使用。)

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