2016-08-05 41 views
1

我目前正在將一些Objective-C代碼轉換爲swift並且卡住了。 我確實有一個內部API填充CFPropertyList並返回它的格式。在Swift中使用對CFPropertyListRef的引用

MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt); 

在Objective-C,我通過

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

稱其通過 「生成的接口:」 我可以看到,迅速轉化爲

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

當我試圖通過快速撥打功能

var fmt = CFPropertyListFormat.XMLFormat_v1_0 
var plist = NSDictionary() as CFPropertyListRef 
MyFunction(plist, &fmt) 

我得到一個EXC_BAD_ACCESS。 由於編譯器不抱怨類型,我認爲這應該是正確的。 任何幫助非常感謝! 感謝

回答

1

如果您在Objective-C的使用是很合適,你MyFunction需求函數頭是這樣的:

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

CFPropertyListRef實際上只是一個在Objective-C的void * typealias 。/ C因此,編譯器很少輸出用於許多可能類型的誤用途警告)

和SWIFT 2個進口功能爲:

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

因此,假設你已經改變了函數頭如上, 你需要使用它,如下所示:

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

這工作得很好。非常感謝你 –