致命错误:没有足够的位来表示 Swift 中传递的值 (Int16)

use*_*041 5 swift

我正在将一个库从 Java (Android) 翻译为 -> Swift (iPhone)

Java代码,工作正常:

   long a = 48590108397870l;
   short b = ((short)(a & 65535));//b == -28370
Run Code Online (Sandbox Code Playgroud)

SWIFT代码:

    let a : Int64  = 48590108397870
    let b: Int16 = Int16(a & 65535)//Fatal error: Not enough bits to represent the passed value
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 10

a & 65535是 0 到 2 16 -1之间的值,适合 an UInt16,但不适合 an Int16。与许多其他语言相反,Swift 不会隐式截断值。

\n

整数有一个init(truncatingIfNeeded:)初始值设定项,可以执行您想要的操作:

\n
\n

当T(源的类型)的位宽等于或大于该类型\xe2\x80\x99s位宽时,结果是源的截断的最低有效位。

\n
\n

例子:

\n
let a : Int64 = 48590108397870\nlet b = Int16(truncatingIfNeeded: a)\nprint(b) // -28370\n
Run Code Online (Sandbox Code Playgroud)\n

另一种选择是首先创建一个无符号整数,然后将其转换为具有相同位模式的有符号整数:

\n
let a : Int64 = 48590108397870\nlet b = Int16(bitPattern: UInt16(a & 0xFFFF))\nprint(b) // -28370\n
Run Code Online (Sandbox Code Playgroud)\n