2014-09-08 2 views
2

Я пытаюсь добавить один байт к переменной данных NSMutable в swift, и я ищу более простой способ. Соответствующий код объектива-c будет:Swift NSMutableData append Byte

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

Я не нашел, что могу сделать что-то подобное в Свифт. Что работа является первым создать массив значений байт, а затем передать, что, например:.

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) 

Есть более простой способ, или я что-то отсутствует? Документ указывает, что он нуждается в UnsafePointer и UnsafePointer могут быть созданы с помощью Word (typealias для Int), поэтому следующие работы

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

Но это не совсем то, что я хочу - я хочу Byte (Uint8). Какие-либо предложения?

+0

Длина должна быть "1" в вашем примере ObjC код: -) –

ответ

7

Согласно Using Swift with Cocoa and Objective-C, когда функция объявлена ​​как принимать аргумент UnsafePointer, он может принимать любое из следующих действий:

  • ноль, который передается в качестве нулевого указателя

  • UnsafePointer , UnsafeMutablePointer или AutoreleasingUnsafeMutablePointer, которое при необходимости преобразуется в UnsafePointer

  • Выражение in-out, операнд которого является lvalue типа Typ е, который передается в качестве адреса именующих [Тип] значение

  • А, который передается как указатель на начало массива, и срок службы-продлеваются на время вызова

Третья пуля означает, что вы можете сделать:

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) 

Edit (Swift 3):

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

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

Спасибо, ключевая часть, которую я отсутствовала, заключалась в том, чтобы использовать var и не позволять объявлять байта. – Brandon

+0

Для совместимости с более новыми (и будущими) версиями коммутатора, я изменил расширение таким образом: '' ' расширение NSMutableData { FUNC appendByte (б: Uint8) { уаг newByte = б self.appendBytes (& newByte, длина: 1) } } '' ' –

Смежные вопросы