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

时间:2014-08-19 10:40:40

标签: ios dictionary swift xcode6-beta6

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

func keyboardWasShown(notification: NSNotification) {
    var info = notification.userInfo
    var keyboardFrame: CGRect = info.objectForKey(UIKeyboardFrameEndUserInfoKey).CGRectValue()
}

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

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

的成员

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

var keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()

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

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

的成员

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

1 个答案:

答案 0 :(得分:41)

正如Xcode 6 beta 6发行说明中所提到的,已经审核了大量的Foundation API以确保可选的一致性。 这些更改会将T!替换为T?T,具体取决于值是否可以为空(或不)。

notification.userInfo现在是可选字典:

class NSNotification : NSObject, NSCopying, NSCoding {
    // ...
    var userInfo: [NSObject : AnyObject]? { get }
    // ...
}

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

var info = notification.userInfo!

但请注意,如果userInfonil,则会在运行时崩溃。

否则最好使用可选的作业:

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