在Tests项目中,我有一些测试辅助函数的扩展。像这样:
extension Employee {
static func mockDict() -> Dictionary<String, Any>! {
return ["ID": arc4random() % 1000,
"FirstName": "Employee First Name",
...]
}
}
(我已经删除了不必要的代码)。出于某些未知原因,我从这本字典中访问ID时遇到了问题。我在施法时获得了SIGABRT 6
employeeDict["ID"] as! Int
Xcode调试器控制台也不喜欢这个特定的整数:
字符串工作正常。你遇到过这样的问题吗?有什么想法吗?
编辑:以防万一也会遇到这个问题。通过设计从UInt32 / Int32到Int FAILS的铸造。即使对象被投放到Any
或Anyobject
之间。
即使
@available(*, message: "Converting UInt32 to Int will always succeed.")
public init?(exactly value: UInt32)
在Int的声明中
public struct Int : SignedInteger, Comparable, Equatable {
...
}
和
public struct Int32 : SignedInteger, Comparable, Equatable {
...
}
编辑2,以便那些可能在JSON序列化中遇到此行为的人。是的,如果要求序列化UInt32,Int64或除Int之外的任何整数协议实例,序列化将失败,并显示错误NSInvalidArgumentException
Invalid type in JSON write (_SwiftValue)
答案 0 :(得分:5)
试试这个:
let a = employeeDict["ID"] as! UInt32
let number = Int(a)
现在您可以使用number
执行任何操作。
答案 1 :(得分:1)
Swift“原始”数字类型不可互换,不能互相投射。
您需要使用初始化程序。
由于arcRandom()
返回UInt32
并且您想将该值用作Int
,请立即在字典声明中将其转换为:
["ID": Int(arc4random() % 1000), ...
PS:不要声明一个明显不可选的隐式无包装可选返回值,这会破坏Swift的强类型系统。
static func mockDict() -> Dictionary<String, Any>
答案 2 :(得分:1)
这对我有用:
Int("\(employeeDict["ID"]!)")