我正在寻找一种将Int的位值强制转换为UInt的方法,反之亦然。例如(为了简单起见,使用8位整数),我想实现以下目标:
let unsigned: UInt8 = toUInt8(-1) // unsigned is 255 or 0xff let signed: Int8 = toInt8(0xff) // signed is -1
首先,我提出了以下解决方案:
let unsigned = unsafeBitCast(Int8(-1), UInt8.self) let signed = unsafeBitCast(UInt8(0xff), Int8.self)
但是Apple在“ unsafeBitCast()”文档中指出以下内容:
..注意::破坏了Swift的类型系统的保证;使用时要格外小心。几乎总是有更好的方法来做任何事情。
有谁有更好的方法?
你可以做:
let unsigned = UInt8(bitPattern: Int8(-1)) // -> 255 let signed = Int8(bitPattern: UInt8(0xff)) // -> -1
存在许多类似的初始化程序:
extension Int8 { init(_ v: UInt8) init(_ v: UInt16) init(truncatingBitPattern: UInt16) init(_ v: Int16) init(truncatingBitPattern: Int16) init(_ v: UInt32) init(truncatingBitPattern: UInt32) init(_ v: Int32) init(truncatingBitPattern: Int32) init(_ v: UInt64) init(truncatingBitPattern: UInt64) init(_ v: Int64) init(truncatingBitPattern: Int64) init(_ v: UInt) init(truncatingBitPattern: UInt) init(_ v: Int) init(truncatingBitPattern: Int) init(bitPattern: UInt8) }