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].integerValue
是NSNumber
?
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 << 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 桥接到 Float [重复]
将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。
InvalidFirebaseData Swift 3 只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。