Swift - 将任何IntegerType转换为Int

时间:2015-12-31 14:32:52

标签: swift

有没有简单的方法可以在Swift中将Any IntegerType转换为Int。我有一个包含不同类型整数的字典; UInt8,UInt16等需要将其转换为Int。有没有比switch语句更简单的方法:

let x: UInt8 = 5
let any: Any = x

var size: Int
switch (any) {
case let value as Int8:   size = Int(value)
case let value as UInt8:  size = Int(value)
case let value as Int16:  size = Int(value)
case let value as UInt16: size = Int(value)
case let value as Int32:  size = Int(value)
case let value as UInt32: size = Int(value)
case let value as Int64:  size = Int(value)
case let value as UInt64: size = Int(value)
case let value as Int:    size = Int(value)
case let value as UInt:   size = Int(value)
default: size = 0
}

1 个答案:

答案 0 :(得分:2)

您的问题是您允许Any进入图片。那时,你失去了很多力量。

您遇到的另一个问题是您编写的代码定义不明确且Swift拒绝您以这种方式编写代码(主要是强制您明确)。如果您传递了UInt64,则无法保证sizevalue具有相同的值。当人们寻求在数字类型之间进行转换的自动方式时,这是一个非常常见的问题。 Swift鼓励您考虑数字转换,因为它们是错误的常见来源。

根据您尝试解决的问题,您可以做几件事。如果您想要一个包含Int64或UInt64的数据结构,那很容易。只需创建您的意思类型。

enum ParsedNumber {
    case Signed(Int64)
    case Unsigned(UInt64)
}

let numbers: [String: ParsedNumber] = [:]

然后你的所有价值观都适合。如果你需要跟踪宽度以便以后,那也没问题:

struct ParsedNumber {
    enum Value {
        case Signed(Int64)
        case Unsigned(UInt64)
    }
    let width: Int
    let value: Value
}

let n = ParsedNumber(width: 32, value: .Signed(2))

这感觉就像你正在解决的问题。另一方面,如果您在一个点上知道您的类型(即它Int8,而不是Any)并且只是希望能够将其传递给函数,只需将函数设置为通用的IntegerType

func calc<Num: IntegerType>(num: Num) { ... }

IntegerType上的有用工具是toIntMax()方法。如果值太大,这将陷阱(崩溃),因此请注意,但它是将任意值转换为已知整数类型的有用方法。如果您已经知道您的签名,还有SignedIntegerTypeUnsignedIntegerType。 (但是你不能将Any转换为这些。你需要在某个地方已经有一个已知的类型。)