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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…