Начнем со следующего определения класса:

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

Затем определение функции обратного вызова:

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

// more code
}

Это приводит к ошибке во второй строке: «Не удается вызвать инициализатор для типа UnsafeMutablePointer со списком аргументов типа UnsafeMutableRawPointer?»

Как правильно выполнить приведение типа UnsafeMutableRawPointer? в 'UnsafeMutablePointer' в Swift 3?

2
BD Wild 26 Ноя 2016 в 02:46

2 ответа

Лучший ответ

Следующая модификация устранила ошибку:

let aqp = inUserData!.assumingMemoryBound(to: Player.self).pointee
5
BD Wild 26 Ноя 2016 в 02:50

Чтобы преобразовать MutableRawPointer в объект, мы используем 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>

Пример:

var info:UnsafeMutableRawPointer = ....
let obj = Unmanaged<$AnyObject>.fromOpaque(info).takeUnretainedValue()
1
Ankit Thakur 26 Ноя 2016 в 04:13