Ios [NSObject:AnyObject]?';没有名为'的成员;下标';Xcode 6 beta 6中出现错误

Ios [NSObject:AnyObject]?';没有名为'的成员;下标';Xcode 6 beta 6中出现错误,ios,dictionary,swift,xcode6-beta6,Ios,Dictionary,Swift,Xcode6 Beta6,当键盘显示在屏幕上时,我使用了下面两行代码来获得键盘的框架。我已注册到UIKeyboardDidShowNotificationnotification func keyboardWasShown(notification: NSNotification) { var info = notification.userInfo var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).C

当键盘显示在屏幕上时,我使用了下面两行代码来获得键盘的框架。我已注册到
UIKeyboardDidShowNotification
notification

func keyboardWasShown(notification: NSNotification) {
    var info = notification.userInfo
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
}
这曾经在beta 5中起作用。我下载了最新的Xcode 6版本,它是beta 6,这个错误发生在第二行

“[NSObject:AnyObject]?”没有名为“objectForKey”的成员。

通过谷歌搜索,我找到了解决方案。我就这样改变了

var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
但现在这似乎也过时了。因为我现在犯了这个错误

“[NSObject:AnyObject]”没有名为“subscript”的成员。


我无法计算出这个错误或如何解决它。

< P>如XCODE 6 Beta 6发行说明中提到的,大量的基础API已经被审核为可选的一致性。 这些更改将替换
T
T?
T
一起使用,具体取决于值是否可以分别为null(或否)

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

class NSNotification : NSObject, NSCopying, NSCoding {
    // ...
    var userInfo: [NSObject : AnyObject]? { get }
    // ...
}
所以你必须打开它。如果您知道
userInfo
不是
nil
,那么 您可以简单地使用“强制展开”:

但请注意,如果
userInfo
nil
,则在运行时会崩溃

否则,最好使用可选分配:

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

谢谢,马丁。成功了。我带着松手走了。有什么不好的地方吗?@Isuru:见更新的答案。如果您知道
userInfo
不是
nil
,那么您可以只打开包装。否则,使用可选作业。我理解。再次感谢:)我在Swift 1.2中遇到一个错误:无法用类型为的索引为“AnyObject”类型的值下标String@VanDuTran:真奇怪。我用Swift 1.2和Swift 2对代码进行了双重检查,它对我来说编译没有问题。
if let info = notification.userInfo {
    var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
} else {
    // no userInfo dictionary present
}