Here is some swift 5:
let data = Data([0x44, 0xfa, 0x00, 0x00]) // 0x44fa0000
let floatNb:Float = data.withUnsafeBytes { $0.load(as: Float.self) }
// note that depending on the input endianess, you could add .reversed() to data
let floatNb:Float = data.reversed().withUnsafeBytes { $0.load(as: Float.self) }
WARNING: this sample throws if your Data is under 4 bytes..
.
Safe Data extension:
extension Data {
    enum Endianess {
        case little
        case big
    }
    func toFloat(endianess: Endianess = .little) -> Float? {
        guard self.count <= 4 else { return nil }
        switch endianess {
        case .big:
            let data = [UInt8](repeating: 0x00, count: 4-self.count) + self
            return data.withUnsafeBytes { $0.load(as: Float.self) }
        case .little:
            let data = self + [UInt8](repeating: 0x00, count: 4-self.count)
            return data.reversed().withUnsafeBytes { $0.load(as: Float.self) }
        }
    }
}
Tests:
let opData        = Data([0x44, 0xFA, 0x00, 0x00])
let nb42          = Data([0x42, 0x28])
let nb42bigEndian = Data([0x28, 0x42])
let tooBig        = Data([0x44, 0xFA, 0x00, 0x00, 0x00])
print("opData:        \(opData.toFloat())")
print("nb42:          \(nb42.toFloat())")
print("nb42bigEndian: \(nb42bigEndian.toFloat(endianess: .big))")
print("tooBig:        \(tooBig.toFloat())")
you may find a faster way but this was good enough for my needs