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
}