有没有简单的方法可以在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
}
答案 0 :(得分:2)
您的问题是您允许Any
进入图片。那时,你失去了很多力量。
您遇到的另一个问题是您编写的代码定义不明确且Swift拒绝您以这种方式编写代码(主要是强制您明确)。如果您传递了UInt64,则无法保证size
与value
具有相同的值。当人们寻求在数字类型之间进行转换的自动方式时,这是一个非常常见的问题。 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()
方法。如果值太大,这将陷阱(崩溃),因此请注意,但它是将任意值转换为已知整数类型的有用方法。如果您已经知道您的签名,还有SignedIntegerType
和UnsignedIntegerType
。 (但是你不能将Any
转换为这些。你需要在某个地方已经有一个已知的类型。)