Search code examples
iosswiftnsdata

'bytes' is unavailable: use withUnsafeBytes instead


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).