如何获得下面的代码来编译?
UIView.setAnimationCurve(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)
现在,它给出了编译错误:
'NSNumber' is not a subtype of 'UIViewAnimationCurve'
当userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue
被声明为NSNumber
时,为什么编译器认为integerValue
是Int
?
class NSNumber : NSValue {
// ...
var integerValue: Int { get }`?
// ...
}
我与其他枚举类型有类似的问题。什么是一般解决方案?
答案 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)
你有两个问题:
可选数字可以表示为NSNumbers,任何下标操作的结果都应该是可选的。在这种情况下,integerValue不是整数,它是一个可选的整数(尾随'?')
枚举不能与整数互换。
尝试:
UIAnimationCurve(userInfo[UIAnimationCurveUserInfoKey]?)
答案 3 :(得分:0)
我的解决方案是
UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: notification.userInfo![UIKeyboardAnimationCurveUserInfoKey]!.integerValue)!)