[SOLVED] 'bytes' is unavailable: use withUnsafeBytes instead

Issue

Code that was previously working in Swift 2.2 is now throwing the following error in Swift 3:

enter image description here

Here is my code:

let tempData: NSMutableData = NSMutableData(length: 26)!
tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes:data.bytes)

What should I replace “data.bytes” with to fix the error? I’ve tried implementing ‘withUnsafeBytes’ and had a look at Apple’s documentation, but can’t get my head around it!

Solution

Assuming that data has type Data, the following should work:

let tempData: NSMutableData = NSMutableData(length: 26)!
data.withUnsafeBytes { 
    tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes: $0)
}

using the

/// 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

method of Data. Inside the closure $0 is a UnsafePointer<Void>
to the bytes (UnsafeRawPointer in Xcode 8 beta 6).

Answered By – Martin R

Answer Checked By – Clifford M. (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published.