如何在Swift中将Int32写入NSOutputStream

时间:2014-10-27 17:57:35

标签: objective-c swift

我试图将一个Int32写入Swift中的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 is not convertible to @lvalue inout $T4

同样,如果我尝试转到NSData,我会得到同样的错误:

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

有什么建议吗?我猜测我只是走错了路。

1 个答案:

答案 0 :(得分:3)

你的最后一种方法几乎是正确的。 value需要是变量参数 这样你就可以将它用作“in-out表达式”&value,而data.bytes需要一个演员:

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))
    }
}