Swift:NSNumber 不是 UIViewAnimationCurve 的子类型

Posted

技术标签:

【中文标题】Swift:NSNumber 不是 UIViewAnimationCurve 的子类型【英文标题】:Swift: NSNumber is not a subtype of UIViewAnimationCurve 【发布时间】:2014-08-12 17:29:05 【问题描述】:

如何让下面的行编译?

UIView.setAnimationCurve(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)

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

'NSNumber' is not a subtype of 'UIViewAnimationCurve'

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

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

我在使用其他枚举类型时也遇到过类似的问题。一般的解决方案是什么?

【问题讨论】:

UIView.setAnimationCurve(UIViewAnimationCurve.fromRaw((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).integerValue)!),语法上没问题,逻辑上不是。 谢谢!没有as NSNumber 也可以。 【参考方案1】:
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,如下所示:

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

【讨论】:

此解决方案通过 XCode 6 beta 6 为我带来了 fatal error: unexpectedly found nil while unwrapping an Optional value。您能否使用有效的解决方案更新您的答案?谢谢。 使用基于块的动画方法更好。但是这里不需要左移,只需使用unsignedLongValue 而不是integerValue &lt;&lt; 16 就可以了。这将使代码行更具可读性。感谢更新! :) 按照我理解文档 (developer.apple.com/library/ios/documentation/uikit/reference/…) 的方式,任何 NSUInteger 值都应该可以解决问题,因为这是 UIViewAnimationOptions 值的原始类型。因此我建议在 Swift 中使用unsignedLongValue 导致UInt 类型值(将转换为NSUInteger,因此具有与UIViewAnimationOptions 相同的类型)。希望这能解释原因。既然您已经问过了,我实际上想知道为什么 您的 解决方案首先是有效的。 ^^【参考方案2】:

我使用下面的代码从用户信息字典中构造了一个动画曲线值:

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

【讨论】:

【参考方案3】:

你有两个问题:

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

    枚举不能与整数互换。

试试:

UIAnimationCurve(userInfo[UIAnimationCurveUserInfoKey]?)

【讨论】:

【参考方案4】:

我的解决办法是

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

【讨论】:

以上是关于Swift:NSNumber 不是 UIViewAnimationCurve 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift 无法将 NSNumber 桥接到 Int

Swift 无法将 NSNumber 桥接到 Float [重复]

将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。

InvalidFirebaseData Swift 3 只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。

NSNumber 类型的托管属性?未初始化为零

无法将 Float 类型的值转换为预期的参数类型 NSNumber