Swift line-by-line file reader with FileHandle

Swift
import Foundation

func forEachLine(at url: URL, _ body: (String) throws -> Void) throws {
    let handle = try FileHandle(forReadingFrom: url)
    defer { try? handle.close() }
    var buffer = Data()
    while let chunk = try handle.read(upToCount: 8192), !chunk.isEmpty {
        buffer.append(chunk)
        while let newline = buffer.firstIndex(of: 0x0A) {
            let line = String(decoding: buffer[..<newline], as: UTF8.self)
            try body(line)
            buffer.removeSubrange(buffer.startIndex..<(newline + 1))
        }
    }
    if !buffer.isEmpty {
        try body(String(decoding: buffer, as: UTF8.self))
    }
}