无法找到'下标'接受提供的参数

时间:2015-05-28 12:08:19

标签: ios swift dictionary optional nsnotification

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!

添加!解决了错误。但是它的原因是什么。解释

2 个答案:

答案 0 :(得分:2)

如果您不添加!,则info是可选的。 而且期权没有那种方法。 您必须了解可选变量的类型完全不同。你必须解开它们以获得你期望的类型的行为(在解包后)。

E.g。

var str = String?

此处str不是可以是nil的字符串,但strOptional,而String可以是nil (Paul Hegarty的声明,CS 193P)

因此,如果您想使用String的方法,则必须首先打开变量以使其为String类型,否则str将为Optional

答案 1 :(得分:1)

在Swift中,userInfo的类型为[NSObject : AnyObject]?

这是一个可选项,包含一个类型为NSObject且值为AnyObject的字典。

如果要在userInfo参数中存储数组,那么您必须弄清楚如何将其转换为正确的类型(展开可选项)。 Swift不喜欢从一种类型转换为一种不兼容的类型,而且我还没有足够专业的语言来告诉你如何做到这一点。我不得不在Xcode中鞭打它一段时间。

为什么不在包含数组的userInfo中存储字典?这很容易做到,并且遵循您在NSNotification的userInfo属性中传递数据时应该使用的模式。