无法将'Swift.UInt32'类型的值转换为'Swift.Int'

问题描述 投票:2回答:2

在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调试器控制台也不喜欢这个特定的整数:

Ints

字符串工作正常。你遇到过这样的问题吗?有任何想法吗?

编辑:以防万一也会遇到这个问题。通过设计从UInt32 / Int32到Int FAILS的铸造。即使对象被投入到AnyAnyobject之间。即使

@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)

swift int arc4random
2个回答
5
投票

试试这个:

let a = employeeDict["ID"] as! UInt32
let number = Int(a)

现在您可以使用number执行任何操作。


1
投票

Swift“原始”数字类型不可互换,不能互相强制转换。

您需要使用初始化程序。

由于arcRandom()返回UInt32并且您想要将该值用作Int,请在字典声明中立即转换它:

["ID": Int(arc4random() % 1000), ...

PS:不要声明一个明显不可选的隐式无包装可选返回值,这会破坏Swift的强类型系统。

static func mockDict() -> Dictionary<String, Any>
© www.soinside.com 2019 - 2024. All rights reserved.