2016-09-28 1 views
0

Я пытаюсь выяснить, как использовать указатель из Data в Swift 3. У меня есть следующий простой метод в OBJ-C, который изменяет 4-е значение в файле значений 10 , Как бы это сделать в Swift 3?Использование указателя в Swift 3 для изменения данных

- (void) modifyFourthValueInFile:(NSString*)filePath { 
    //filePath is a file that contains 10 SInt16 values 
    NSData *data = [NSData dataWithContentsOfFile:filePath]; 
    SInt16 *ourPointer = (SInt16*)data.bytes; 
    ourPointer += 3; // get the 4th value 
    *ourPointer = 1234; // modify the 4th value 
    [data writeToFile:filePath atomically:YES]; 
} 

ответ

1

Возможный подход:

  • Чтение файла в значение Data.
  • Используйте withUnsafeMutableBytes() для изменения байтов.
  • Создайте UnsafeMutableBufferPointer, это позволяет изменять данные через subscriptip вместо арифметики указателя.
  • Запишите данные обратно в файл.
  • Используйте do/try/catch для обработки ошибок.

Пример:

func modifyFile(filePath: String) { 
    let fileURL = URL(fileURLWithPath: filePath) 
    do { 
     var data = try Data(contentsOf: fileURL) 
     data.withUnsafeMutableBytes { (i16ptr: UnsafeMutablePointer<Int16>) in 
      let i16buffer = UnsafeMutableBufferPointer(start: i16ptr, count: data.count/MemoryLayout<Int16>.stride) 

      i16buffer[3] = 1234 // modify the 4th value 
     } 
     try data.write(to: fileURL, options: .atomic) 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 
+0

На самом деле я обнаружил, что все создания шаг буфера не нужен, так как вы можете индексировать с UnsafeMutablePointer непосредственно, как это: i16ptr [3] = 1234 – kishdude

+0

@kishdude: Вы правы, я понял это позже. Возможные преимущества буфера: 1) проверка границ 2) это коллекция, поэтому вы можете перебирать ее элементы. –

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