Swift NSMutableData附加Byte

时间:2014-09-08 23:03:20

标签: swift

我试图在swift中将一个字节附加到NSMutable数据变量,我正在寻找一种更简单的方法。相关的Objective-c代码将是:

NSMutableData *data = [[NSMutableData alloc] init];
uint8_t number = 255;
[data appendBytes:&number length:2];

我没有发现我可以在Swift中做类似的事情。首先创建一个Byte值数组,然后将其传递出去是有效的。例如:

    var data = NSMutableData()
    let value: Byte = 0xFF
    let byte: [Byte] = [value]
    data.appendBytes(byte, length: 1)

    //this works too and is a little simpler
    data.appendBytes([value] as [Byte], length: 1)

有更简单的方法还是我错过了什么? doc指定它需要一个UnsafePointer,并且可以使用Word(Int的类型)创建UnsafePointer,因此以下工作

    var word: Word = 255
    data.appendBytes(UnsafePointer(bitPattern: word), length: 4)

但那不是我想要的 - 我想要一个Byte(UInt8)。有什么建议吗?

1 个答案:

答案 0 :(得分:7)

根据Using Swift with Cocoa and Objective-C,当一个函数被声明为采用UnsafePointer参数时,它可以接受以下任何一个:

  • nil,作为空指针传递

  • UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时转换为UnsafePointer

  • 一个输入输出表达式,其操作数是类型为Type的左值,它作为左值的地址传递

  • 一个[Type]值,作为指向数组开头的指针传递,并在调用期间延长生命周期

第三个子弹意味着你可以做到:

var value: Byte = 0xFF    // must be var, let will not work
data.appendBytes(&value, length: 1)

注意:您必须在此使用var而不是let,因为它必须是左值。

如果您发现自己经常添加单个字节,则可以扩展NSMutableData

extension NSMutableData {
    func appendByte(var b: Byte) {
        self.appendBytes(&b, length: 1)
    }
}

var data = NSMutableData()
data.appendByte(255)

编辑(Swift 3):

extension NSMutableData {
  func appendByte(_ i: Int8) {
    var i = i
    self.append(&i, length: 1)
  }
}

var data = NSMutableData()
data.appendByte(255)