Swift:NSNumber不是UIViewAnimationCurve的子类型

时间:2014-06-22 15:55:21

标签: types casting enums swift nsnumber

如何获得下面的代码来编译?

UIView.setAnimationCurve(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)

现在,它给出了编译错误:

'NSNumber' is not a subtype of 'UIViewAnimationCurve'

userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue被声明为NSNumber时,为什么编译器认为integerValueInt

class NSNumber : NSValue {
    // ...
    var integerValue: Int { get }`?
    // ...
}

我与其他枚举类型有类似的问题。什么是一般解决方案?

4 个答案:

答案 0 :(得分:13)

UIView.setAnimationCurve(UIViewAnimationCurve.fromRaw(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!)

了解详情:Swift enumerations & fromRaw()

更新

基于this answer to How to use the default iOS7 UIAnimation curve,我使用新的基于块的动画方法+ animateWithDuration:delay:options:animations:completion:,并像UIViewAnimationOptions一样获取:{/ p>

let options = UIViewAnimationOptions(UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).integerValue << 16))

答案 1 :(得分:2)

我使用以下代码从用户信息字典构建动画曲线值:

let rawAnimationCurveValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).unsignedIntegerValue
let keyboardAnimationCurve = UIViewAnimationCurve(rawValue: rawAnimationCurveValue)

答案 2 :(得分:0)

你有两个问题:

  1. 可选数字可以表示为NSNumbers,任何下标操作的结果都应该是可选的。在这种情况下,integerValue不是整数,它是一个可选的整数(尾随'?')

  2. 枚举不能与整数互换。

  3. 尝试:

    UIAnimationCurve(userInfo[UIAnimationCurveUserInfoKey]?)
    

答案 3 :(得分:0)

我的解决方案是

UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: notification.userInfo![UIKeyboardAnimationCurveUserInfoKey]!.integerValue)!)