2015-04-09 1 views
0

В предыдущей версии стрижа я был в состоянии использовать форму ответа на этот пост: Read a file/URL line-by-line in Swiftпрочитать файл построчно в быстром 1.2

сделать линию по линии чтения файла в стрижа. Теперь, когда я обновил до 1.2, это больше не похоже на компиляцию. Есть ли обновленный способ чтения файла по строкам в swift 1.2?

ответ

0

Apple усиливает синтаксис языка, поэтому в Swift версии 1.2 больше не разрешены в предыдущих версиях. Вам придется пройти и очистить код, чтобы он компилировался.

3

Вот обновленная версия StreamReader для Swift 1.2 (который, если кто-то хочет, чтобы рассмотреть его, чтобы убедиться, что это нормально, вероятно, должен быть отредактирован в оригинальный ответ теперь, что 1,2 это текущая выпущенная версия):

class StreamReader { 

    let encoding : UInt 
    let chunkSize : Int 

    var fileHandle : NSFileHandle! 
    let buffer : NSMutableData! 
    let delimData : NSData! 
    var atEof : Bool = false 

    init?(path: String, delimiter: String = "\n", encoding : UInt = NSUTF8StringEncoding, chunkSize : Int = 4096) { 
     self.chunkSize = chunkSize 
     self.encoding = encoding 

     if let fileHandle = NSFileHandle(forReadingAtPath: path), 
       delimData = delimiter.dataUsingEncoding(NSUTF8StringEncoding), 
       buffer = NSMutableData(capacity: chunkSize) 
     { 
      self.fileHandle = fileHandle 
      self.delimData = delimData 
      self.buffer = buffer 
     } else { 
      self.fileHandle = nil 
      self.delimData = nil 
      self.buffer = nil 
      return nil 
     } 
    } 

    deinit { 
     self.close() 
    } 

    /// Return next line, or nil on EOF. 
    func nextLine() -> String? { 
     precondition(fileHandle != nil, "Attempt to read from closed file") 

     if atEof { 
      return nil 
     } 

     // Read data chunks from file until a line delimiter is found: 
     var range = buffer.rangeOfData(delimData, options: nil, range: NSMakeRange(0, buffer.length)) 
     while range.location == NSNotFound { 
      var tmpData = fileHandle.readDataOfLength(chunkSize) 
      if tmpData.length == 0 { 
       // EOF or read error. 
       atEof = true 
       if buffer.length > 0 { 
        // Buffer contains last line in file (not terminated by delimiter). 
        let line = NSString(data: buffer, encoding: encoding) 

        buffer.length = 0 
        return line as String? 
       } 
       // No more lines. 
       return nil 
      } 
      buffer.appendData(tmpData) 
      range = buffer.rangeOfData(delimData, options: nil, range: NSMakeRange(0, buffer.length)) 
     } 

     // Convert complete line (excluding the delimiter) to a string: 
     let line = NSString(data: buffer.subdataWithRange(NSMakeRange(0, range.location)), 
      encoding: encoding) 
     // Remove line (and the delimiter) from the buffer: 
     buffer.replaceBytesInRange(NSMakeRange(0, range.location + range.length), withBytes: nil, length: 0) 

     return line as String? 
    } 

    /// Start reading from the beginning of file. 
    func rewind() -> Void { 
     fileHandle.seekToFileOffset(0) 
     buffer.length = 0 
     atEof = false 
    } 

    /// Close the underlying file. No reading must be done after calling this method. 
    func close() -> Void { 
     fileHandle?.closeFile() 
     fileHandle = nil 
    } 
} 
+0

Спасибо за выполнение моей работы :) (Jeef мог бы уведомить напрямую.) Я посмотрю на него и обнов оригинальный ответ, когда вернусь на свой компьютер. –

+0

np, btw вы хотели написать 'delimData = delimiter.dataUsingEncoding (encoding)' или я смущен? –

+0

Вы, конечно, правы, эта ошибка произошла, когда я добавил параметр 'delimiter' в версию 2. - Ваш код выглядит идеально. Это нормально, если я использую его для обновления моего ответа? –

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