Objective c 如何在Swift中将Int32写入NSOutputStream

Objective c 如何在Swift中将Int32写入NSOutputStream,objective-c,swift,Objective C,Swift,我正在尝试用Swift将Int32写入NSOutputStream,但遇到了一些困难。在ObjC中,我会这样做: -(void)write4ByteField:(int32_t)value { [stream write:((value >> 24) & 0xff)]; [stream write:((value >> 16) & 0xff)]; [stream write:((value >> 8) & 0xf

我正在尝试用Swift将Int32写入NSOutputStream,但遇到了一些困难。在ObjC中,我会这样做:

-(void)write4ByteField:(int32_t)value {
    [stream write:((value >> 24) & 0xff)];
    [stream write:((value >> 16) & 0xff)];
    [stream write:((value >> 8) & 0xff)];
    [stream write:(value & 0xff)];
}
然而,在Swift中,它真的不喜欢我做所有的低级位转换,我放弃了在所有地方铸造值

我试过这样的方法:

func write4ByteField(value: Int32) {
    stream.write(&value, maxLength: sizeof(Int32))
}
但是我得到一个错误,
int16不能转换为@lvalue inout$T4

类似地,如果我尝试转到NSData,我会得到相同的错误:

func write4ByteField(value: Int32) {
    let data = NSData(bytes: &value, length: sizeof(Int32)
    stream.write(data.bytes, maxLength: sizeof(Int32))
}

有什么建议吗?我猜我只是走错了方向。

你最后的方法几乎是正确的<代码>值需要是一个可变参数 因此,您可以将其用作“输入输出表达式”
&value
,以及
数据。字节
需要强制转换:

func write4ByteField(var value: Int32) {
    let data = NSData(bytes: &value, length: sizeof(Int32))
    stream.write(UnsafePointer(data.bytes), maxLength: sizeof(Int32))
}
它也可以在不使用NSData的情况下完成,包括转换为big-endian 字节顺序:

func write4ByteField(value: Int32) {
    var valueBE = value.bigEndian
    withUnsafePointer(&valueBE) { 
        self.stream.write(UnsafePointer($0), maxLength: sizeofValue(valueBE))
    }
}

令人惊叹的!我想我错过的主要事情是我从未见过
带有unsafepointer的
结构。对于与我一直在努力使用的其他ObjC API进行交互非常有用,因为我需要一个
inout
指针。最后我找到了它+1.