2016-11-25 1 views
1

A partir d'une définition de classe comme suit:coulée une variable de type 'UnsafeMutableRawPointer' à UnsafeMutablePointer <> Swift 3

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

définir ensuite une fonction de rappel:

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

// more code 
} 

Il en résulte une erreur sur la deuxième ligne: "Impossible d'appeler l'initialiseur pour le type 'UnsafeMutablePointer' avec une liste d'arguments de type 'UnsafeMutableRawPointer?'

Comment puis-je convertir correctement du type 'UnsafeMutableRawPointer?' ? À 'UnsafeMutablePointer' à Swift 3

+0

'assumingMemoryBound (à:)'. Les pointeurs bruts ne doivent pas être "castés" comme dans C. – CodaFi

+0

Ce qui suit a fonctionné: 'let aqp = inUserData! .assumingMemoryBound (à: Player.self) .pointee'. Je vous remercie. –

+0

@BDWild Ne pas modifier la question pour afficher la réponse: _answer_ la question (en réponse). Répondre à votre propre question est parfaitement bien. En 48 heures, vous pouvez même accepter votre propre réponse. – matt

Répondre

2

La modification suivante a éliminé l'erreur:

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

Est-ce que cela a fonctionné pour vous? –

+0

Oui, ça a marché pour moi. –

0

pour convertir MutableRawPointer à l'objet, nous utilisons api fromOpaque

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

exemple:

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

Pour toute personne rencontrant cela, veuillez vous abstenir d'utiliser l'API 'Unmanaged' pour cela, sauf si vous avez besoin de contrôler le nombre de références des valeurs du pointeur (ce qui n'est pratiquement jamais le cas). Il existe des solutions sanctionnées, typesafe. – CodaFi