Search code examples
typescastingenumsswiftnsnumber

Swift: NSNumber is not a subtype of UIViewAnimationCurve


How do I get the line below to compile?

UIView.setAnimationCurve(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)

Right now, it gives the compile error:

'NSNumber' is not a subtype of 'UIViewAnimationCurve'

Why does the compiler think userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue is an NSNumber when integerValue is declared as an Int?

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

I've had similar issues with other enum types. What is the general solution?


Solution

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

    Read more: Swift enumerations & fromRaw()

    UPDATE

    Based on this answer to How to use the default iOS7 UIAnimation curve, I use the new block-based animation method, + animateWithDuration:delay:options:animations:completion:, and get the UIViewAnimationOptions like so:

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