func keyboardDidShow(notification:NSNotification) {
var info = notification.userInfo
var keyboardHeight: CGFloat = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size.height
constraintScrollViewBottomSpace.constant = keyboardHeight
}
上面的代码给出了错误
找不到'下标'的重载接受提供的参数
我该怎么做才能让它发挥作用?
var info = notification.userInfo!
添加!
解决了错误。但是它的原因是什么。解释
答案 0 :(得分:2)
如果您不添加!
,则info是可选的。
而且期权没有那种方法。
您必须了解可选变量的类型完全不同。你必须解开它们以获得你期望的类型的行为(在解包后)。
E.g。
var str = String?
此处str
不是可以是nil
的字符串,但str
是Optional
,而String
可以是nil
(Paul Hegarty的声明,CS 193P)
因此,如果您想使用String
的方法,则必须首先打开变量以使其为String
类型,否则str
将为Optional
答案 1 :(得分:1)
在Swift中,userInfo的类型为[NSObject : AnyObject]?
这是一个可选项,包含一个类型为NSObject且值为AnyObject的字典。
如果要在userInfo参数中存储数组,那么您必须弄清楚如何将其转换为正确的类型(和展开可选项)。 Swift不喜欢从一种类型转换为一种不兼容的类型,而且我还没有足够专业的语言来告诉你如何做到这一点。我不得不在Xcode中鞭打它一段时间。
为什么不在包含数组的userInfo中存储字典?这很容易做到,并且遵循您在NSNotification的userInfo属性中传递数据时应该使用的模式。