BD Wild
BD Wild

Reputation: 189

Casting a variable of type 'UnsafeMutableRawPointer' to UnsafeMutablePointer<> in Swift 3

Starting with a class definition as follows:

class Player {
    var playbackFile: AudioFileID? = nil
    var packetPosition: Int64 = 0
    var numPacketsToRead: UInt32 = 0
    var packetDescs: UnsafeMutablePointer<AudioStreamPacketDescription>? = nil
    var isDone = false
}

Then defining a callback function:

let AQOutputCallback: AudioQueueOutputCallback = {(inUserData, inAQ, inCompleteAQBuffer) -> () in
   let aqp = UnsafeMutablePointer<Player>(inUserData).pointee // this gives an error

// more code
}

This results in an error on the second line: "Cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type 'UnsafeMutableRawPointer?'

How do I properly cast from type 'UnsafeMutableRawPointer?' to 'UnsafeMutablePointer' in Swift 3?

Upvotes: 2

Views: 5593

Answers (2)

Ankit Thakur
Ankit Thakur

Reputation: 4749

to convert MutableRawPointer to object, we use fromOpaque api

/// Unsafely turns an opaque C pointer into an unmanaged class reference.
///
/// This operation does not change reference counts.
///
///     let str: CFString = Unmanaged.fromOpaque(ptr).takeUnretainedValue()
///
/// - Parameter value: An opaque C pointer.
/// - Returns: An unmanaged class reference to `value`.
public static func fromOpaque(_ value: UnsafeRawPointer) -> Unmanaged<Instance>

example:

var info:UnsafeMutableRawPointer = ....
let obj = Unmanaged<$AnyObject>.fromOpaque(info).takeUnretainedValue()

Upvotes: 1

BD Wild
BD Wild

Reputation: 189

The following modification eliminated the error:

let aqp = inUserData!.assumingMemoryBound(to: Player.self).pointee

Upvotes: 10

Related Questions