我试图在
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).有什么建议?
解决方法
根据
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而不是因为它必须是左值.
如果您发现自己经常添加单个字节,则可以扩展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)