The solution of this question no longer works with Swift 3.
There is no longer a property bytes of Data (formerly NSData.
let data = dataToWrite.first!
self.outputStream.write(&data, maxLength: data.count)
With this code, I get the error:
Cannot convert value of type 'Data' to expected argument type 'UInt8'
How can you write Data to an NSOutputStream in Swift 3?
Just use this extension:
extension OutputStream {
func write(data: Data) -> Int {
return data.withUnsafeBytes {
write($0.bindMemory(to: UInt8.self).baseAddress!, maxLength: data.count)
}
}
}
And for InputStream
extension InputStream {
func read(data: inout Data) -> Int {
return data.withUnsafeMutableBytes {
read($0.bindMemory(to: UInt8.self).baseAddress!, maxLength: data.count)
}
}
}
extension OutputStream {
func write(data: Data) -> Int {
return data.withUnsafeBytes { write($0, maxLength: data.count) }
}
}
extension InputStream {
func read(data: inout Data) -> Int {
return data.withUnsafeMutableBytes { read($0, maxLength: data.count) }
}
}
NSData had a bytes property to access the bytes.
The new Data value type in Swift 3 has a withUnsafeBytes()
method instead, which calls a closure with a pointer to the bytes.
So this is how you write Data to an NSOutputStream
(without casting to NSData):
let data = ... // a Data value
let bytesWritten = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }
Remarks:
withUnsafeBytes() is a generic method:
/// Access the bytes in the data.
///
/// - warning: The byte pointer argument should not be stored and used outside of the lifetime of the call to the closure.
public func withUnsafeBytes<ResultType, ContentType>(_ body: @noescape (UnsafePointer<ContentType>) throws -> ResultType) rethrows -> ResultType
In the above call,
both ContentType and ResultType are automatically inferred by
the compiler (as UInt8 and Int), making additional
UnsafePointer() conversions unnecessary.
outputStream.write() returns the number of bytes actually written.
Generally, you should check that value. It can be -1 if
the write operation failed, or less than data.count when writing
to sockets, pipes, or other objects with a flow control.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With