[NSObject:AnyObject]?' 在Xcode 6 beta 6中没有名为'subscript'的成员

Isu*_*uru 24 dictionary ios swift xcode6-beta6

我使用下面几行代码行来获取屏幕上显示的键盘框架.我已注册UIKeyboardDidShowNotification通知.

func keyboardWasShown(notification: NSNotification) {
    var info = notification.userInfo
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
}
Run Code Online (Sandbox Code Playgroud)

这曾经在测试版5中工作.我下载了最新的Xcode 6版本,它是beta 6,这个错误发生在第二行.

'[NSObject:AnyObject]?' 没有名为'objectForKey'的成员

经过一些谷歌搜索,我遇到了这个解决方案.我改变了它,

var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
Run Code Online (Sandbox Code Playgroud)

但现在似乎也已经过时了.因为我现在得到这个错误.

'[NSObject:AnyObject]?' 没有名为'下标'的成员

我无法弄清楚这个错误或如何解决它.

Mar*_*n R 41

正如Xcode 6 beta 6发行说明中所提到的,已经审计了大量的Foundation API以实现可选的一致性.这些更改将替换T!T?或者T取决于值是否可以分别为空(或不).

notification.userInfo现在是一个可选字典:

class NSNotification : NSObject, NSCopying, NSCoding {
    // ...
    var userInfo: [NSObject : AnyObject]? { get }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

所以你必须打开它.如果你知道userInfo不是nil那么你可以简单地使用"强制解包":

var info = notification.userInfo!
Run Code Online (Sandbox Code Playgroud)

但请注意,如果userInfo是,这将在运行时崩溃nil.

否则最好使用可选的赋值:

if let info = notification.userInfo {
    var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
} else {
    // no userInfo dictionary present
}
Run Code Online (Sandbox Code Playgroud)