2016-08-05 43 views
1

Ich bin gerade dabei, einige Objective-C-Code in Swift und ich bin festgefahren. Ich habe eine interne API, die eine CFPropertyList füllt und ihr Format zurückgibt.Verwenden eines Verweises auf CFPropertyListRef in Swift

MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt); 

In Objective-C Aufruf ich es über

CFDictionaryRef myList; 
CFPropertyListFormat fmt; 
MyFunction(&myList, &fmt) 

Über die "generiert Interface" i, dass rasche umgewandelt sehen zu

MyFunction(_ list: CFPropertyList!, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>)) 

Wenn ich versuche, Rufen Sie die Funktion in swift über

Ich erhalte eine EXC_BAD_ACCESS. Da der Compiler sich nicht über die Typen beschwert, denke ich, dass dies richtig sein sollte. Jede Hilfe wird sehr geschätzt! Dank

Antwort

1

Wenn Ihre Nutzung in Objective-C wirklich richtig ist, die Funktion Header Ihrer MyFunction Bedürfnisse, so etwas sein:

extern void MyFunction(CFPropertyListRef *list, CFPropertyListFormat *fmt); 

(CFPropertyListRef eigentlich nur ein typealias von void * in Objective-C ./C so gibt der Compiler selten Warnungen für viele mögliche Art mis-Anwendungen)

Und Swift 2 Importe solche Funktion wie:.

public func MyFunction(list: UnsafeMutablePointer<Unmanaged<CFPropertyList>?>, _ fmt: UnsafeMutablePointer<CFPropertyListFormat>) 
So 210

, vorausgesetzt, Sie den Funktionskopf wie oben geändert haben, Sie verwenden müssen sie wie folgt:

var fmt: CFPropertyListFormat = .XMLFormat_v1_0 
var umPlist: Unmanaged<CFPropertyList>? = nil 
MyFunction(&umPlist, &fmt) 
var plist = umPlist?.takeRetainedValue() //or this may be `umPlist?.takeUnretainedValue()` 
+0

Das funktioniert sehr gut. Vielen Dank –