(我是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'
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:输入'[NSObject:AnyObject]?'没有下标成员
答案 0 :(得分:1)
您使用下标的想法是正确的,但是正如您可以看到?
的存在,userInfo
字典是Optional,这意味着它可以是nil(在Objective-中) C,没有区别)。此外,Swift的字典不像NSDictionary那样宽松,因此您需要使用as?
来确保该值是您期望的Foo
实例。
您无法直接下标可选字典,但如果您使用?
for optional chaining,则可以在字典为非零时访问该值。我还建议if let
访问最终值,如果它是非零的。 (或者,如果Foo不存在,您可以选择将guard let
与fatalError
或return
一起使用。)
if let foo = notification.userInfo?[BarKey] as? Foo {
// foo is non-nil (type `Foo`) in here
}