Запись данных в OutputStream с помощью Swift 5+ - PullRequest
0 голосов
/ 24 апреля 2019

Этот код был в порядке (в том смысле, что компилятор не жаловался):

extension OutputStream {
    func write(_ data: Data) -> Int {
        return data.withUnsafeBytes { pointer in
            return self.write(pointer, maxLength: data.count)
        }
    }
}

Начиная с Swift 5.0, выдается предупреждение:

Предупреждение: «withUnsafeBytes» устарело: используйте withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R вместо

Я пытался использовать предложенный метод, но, похоже, я не могу свернуть UnsafeRawBufferPointer в UnsafePointer<UInt8>, который в конечном итоге требует OutputStream.write.

Как я могу написать эту функцию не осуждаемым способом?

1 Ответ

1 голос
/ 24 апреля 2019

Хитрость заключается в использовании функции bindMemory:

func write(_ data: Data) -> Int {
    return data.withUnsafeBytes({ (rawBufferPointer: UnsafeRawBufferPointer) -> Int in
        let bufferPointer = rawBufferPointer.bindMemory(to: UInt8.self)
        return self.write(bufferPointer.baseAddress!, maxLength: data.count)
    })
}

Хотя это работает со Swift 5.0, очевидно, есть некоторые проблемы; см. соответствующее обсуждение на форуме .

...