2016-09-28 7 views
0

私はSwift 3のデータからポインタを使う方法を解明しようとしています。OBJ-Cでは、10値ファイルの4番目の値を変更する次の簡単な方法があります。私はスイフト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()を使用してバイトを変更します。
  • を作成すると、ポインタ演算の代わりにサブスクリプトを使用して のデータを変更できます。
  • データをファイルに書き戻します。
  • エラー処理のために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)コレクションであるため、その要素を反復処理できます。 –

関連する問題