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

Posted

技术标签:

【中文标题】[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误【英文标题】:[NSObject : AnyObject]?' does not have a member named 'subscript' error in Xcode 6 beta 6 【发布时间】:2014-10-12 10:20:32 【问题描述】:

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

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

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

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

经过一番谷歌搜索,我发现了this 解决方案。我就这样改了,

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

但现在看来这也已经过时了。因为我现在收到此错误。

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

我不知道这个错误或如何解决它。

【问题讨论】:

【参考方案1】:

如 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

【讨论】:

谢谢,马丁。有效。我和unwarping一起去了。它有什么缺点吗? @Isuru:查看更新的答案。如果您知道 userInfo 不是nil,那么您可以直接展开。否则使用可选赋值。 我明白了。再次感谢:) 我在使用 Swift 1.2 时遇到错误:无法使用 String 类型的索引为“AnyObject”类型的值下标 @VanDuTran:这很奇怪。我已经用 Swift 1.2 和 Swift 2 仔细检查了代码,它编译对我来说没有问题。

以上是关于[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误的主要内容,如果未能解决你的问题,请参考以下文章

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

无法将类型 [NSObject : AnyObject] 转换为字符串

条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]

无法将类型“NSMutableDictionary”的值转换为强制类型“[NSObject: AnyObject]”以用于 google ios Analytics

增加框架的大小 - Keyboardwillshow - Swift

如何改变 Swift Dictionary of Dictionary