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

4
在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是设计上失败的。即使对象在中间被转换为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 {
    ...
}

针对可能会在JSON序列化中遇到此问题的人,进行第二次编辑。是的,如果要序列化UInt32、Int64或任何整数协议实例(除了Int),则序列化将失败,并显示错误NSInvalidArgumentExceptionInvalid type in JSON write (_SwiftValue)

3个回答

9

试试这个:

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

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

1
谢谢,我已经像这样制定了解决方案。但我仍然感到困惑,因为应用程序在 iPhone 7 sim 上运行,其中 Int 是 64 位。此外,892 绝对是不会导致溢出或任何其他问题的整数。 - user1232690
我认为问题是因为您试图将数字强制转换为整数,而不是从UInt32创建整数。此外,如果我的答案对您有帮助,请接受它好吗?谢谢! - Pranav Wadhwa
1
完成。我已经在问题中添加了一些细节。顺便说一下,我发现唯一的通用方法是使用 NSNumber,以便将 Integer 协议实例转换为 Int 而不会崩溃。 - user1232690

2

这对我有效:

Int("\(employeeDict["ID"]!)")

是的,您可以使用中间转换来解决这个问题。UInt32 -> Int 转换的问题大多已经得到解决,尤其是在 JSONSerialization 中,该问题会导致序列化带有 UInt32 的字典时崩溃。 - user1232690

1

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

您需要使用初始化程序。

由于arcRandom()返回UInt32,而您想将该值用作Int,因此请在字典声明中立即进行转换:

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

注意:不要将明显非可选项声明为隐式解包的可选返回值,这会破坏 Swift 的强类型系统。

static func mockDict() -> Dictionary<String, Any>

首先,我在JSONSerialization中遇到了这个问题。经过深入挖掘,我发现了我在问题中列出的问题。如果首先将它们转换为任何类型,则将非Int整数强制转换为Int没有简单的解决方案。例如,我们有一个Swift DB适配器,其中包含不同大小的整数字段。在Objective C中,它们可以被转换为对象,然后转换为任何类型的整数或序列化。因此,我对Swift缺乏这种功能感到困惑。 - user1232690
关于 "!",测试逻辑可能会产生空结果,我已经删除了生成可能字典的代码。所以你是正确的,但在实际代码中没问题。 - user1232690

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接