Lucas Farah
Lucas Farah

Reputation: 1092

Using NSFileHandle on Swift 3

How could I write this method in Swift 3?

extension NSFileHandle {
    func readUInt32() -> UInt32? {
        let data = self.readDataOfLength(4)
        guard data.length == 4 else { return nil }
        return CFSwapInt32HostToBig(UnsafePointer<UInt32>(data.bytes).memory)
    }
}

Upvotes: 4

Views: 1379

Answers (1)

Martin R
Martin R

Reputation: 539685

extension FileHandle {
    func readUInt32() -> UInt32? {
        let data = self.readData(ofLength: 4)
        guard data.count == 4 else { return nil }
        return UInt32(bigEndian: data.withUnsafeBytes { $0.pointee })
    }
}

Reading from a FileHandle returns a Data value. data.withUnsafeBytes calls the closure with a pointer to the bytes, here the type of the pointer $0 is inferred from the context as UnsafePointer<UInt32>.

UInt32(bigEndian:) creates an integer from its big-endian representation, as an alternative to CFSwapInt32BigToHost().

For more examples on how to convert from/to Data, see for example round trip Swift number types to/from Data.

Upvotes: 4

Related Questions