Swift中的C联合类型?

Dao*_*yen 13 c unions swift

如何在Swift中声明和使用C联合类型?

我试过了:

var value: union {
      var output: CLongLong
      var input: [CInt]
    }
Run Code Online (Sandbox Code Playgroud)

但它不起作用......

更新:我想使用union将a分割8 bytes number为2 x 4 bytes number.

Eri*_*sui 16

作为Apple Swift文档,Enumerations可以做类似的事情.

可替换地,enumeration部件可以指定任何类型的相关联的值与每个不同的部件值一起存储,多达 unionsvariants其他语言做.您可以将一组公共相关成员定义为一个枚举的一部分,每个枚举都有一组与其关联的适当类型的不同值.

1)如果你只想将一个8字节的数字拆分为2 x 4字节的数字,正如你可能已经知道的那样,Swift 的Bitwise操作可能有所帮助.就像

let bigNum: UInt64 = 0x000000700000008 //
let rightNum = (bigNum & 0xFFFFFFFF) // output 8
let leftNum = (bigNum >> 32)  // output 7
Run Code Online (Sandbox Code Playgroud)

2)如果你想模拟unionC语言这样的行为,我尝试了这样的方法.虽然它有效但看起来很糟糕.

enum Number {
    case a(Int)
    case b(Double)

    var a:Int{
        switch(self)
        {
        case .a(let intval): return intval
        case .b(let doubleValue): return Int(doubleValue)
        }
    }

    var b:Double{
        switch(self)
        {
        case .a(let intval): return Double(intval)
        case .b(let doubleValue): return doubleValue
        }
    }
}
let num = Number.b(5.078)

println(num.a)  // output 5
println(num.b)  // output 5.078
Run Code Online (Sandbox Code Playgroud)

  • (2)根本不像C联合,只是在double和int之间进行转换.AC union会让两个vars共享相同的内存位置,因此存储8个字节的Double(5.078)占用并读取它们,因为Int不会返回5,而是0x40144FDF3B645A1D(4,617,403,338,154,334,749,yikes!) (5认同)