首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速阅读NSNotification userInfo

快速阅读NSNotification userInfo
EN

Stack Overflow用户
提问于 2016-03-03 08:03:10
回答 1查看 1K关注 0票数 1

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

我正在将一些Objective代码移植到Swift,我不知道如何翻译它:

代码语言:javascript
复制
-(void) fooDidBar:(NSNotification *)notification
{
    Foo* foo = [[notification userInfo] objectForKey:BarKey];
    // do stuff with foo
}

到目前为止我有这样的想法:

代码语言:javascript
复制
private func fooDidBar(notification: NSNotification) {
    var foo: Foo = notification.userInfo.objectForKey(BarKey)
}

但是我得到了一个编译器错误:

/Users/me/src-me/project/FooBarViewController.swift:53:57:值类型为“NSObject:AnyObject?”没有成员“objectForKey”

因为userInfoUIApplicationShortcutItem.h中被声明为NSDictionary

代码语言:javascript
复制
@property (nullable, nonatomic, copy) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;

...I认为我应该试试这个:

代码语言:javascript
复制
= notification.userInfo[BarKey]

但是我得到了这个错误:

/Users/me/src-me/project/FooBarViewController.swift:53:65:类型的“NSObject:AnyObject?”没有下标成员

EN

回答 1

Stack Overflow用户

发布于 2016-03-03 08:06:03

使用下标的想法是正确的,但是从?的存在可以看出,userInfo字典是可选,这意味着它可以是零(在Objective中,没有区别)。而且,Swift的字典对类型的处理不如NSDictionary,因此您需要使用as?来确保值如您所期望的那样是Foo实例。

不能直接下标可选字典,但如果使用用于可选链接,则可以访问字典为非零的值。我还建议if let在非零的情况下访问最终值。(或者您可以选择在没有Foo的情况下,将guard letfatalErrorreturn一起使用。)

代码语言:javascript
复制
if let foo = notification.userInfo?[BarKey] as? Foo {
    // foo is non-nil (type `Foo`) in here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35766406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档