在 Swift 中使用对 CFPropertyListRef 的引用

Using a reference to CFPropertyListRef in Swift

我目前正在将一些 Objective-C 代码转换为 swift,但我被卡住了。 我确实有一个内部 API 填充 CFPropertyList 并返回它的格式。

MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt);

在 Objective-C 我通过

调用它
CFDictionaryRef myList;
CFPropertyListFormat fmt;
MyFunction(&myList, &fmt)

通过 "Generated Interface" 我可以看到 swift 转换为

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

当我尝试通过

调用swift中的函数时
var fmt = CFPropertyListFormat.XMLFormat_v1_0
var plist = NSDictionary() as CFPropertyListRef
MyFunction(plist, &fmt)

我收到 EXC_BAD_ACCESS。 由于编译器不会抱怨类型,我认为这应该是正确的。 非常感谢任何帮助! 谢谢

如果你在Objective-C中的用法确实正确,你的MyFunction的函数头应该是这样的:

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

CFPropertyListRef 实际上只是 Objective-C/C 中 void * 的类型别名。因此,编译器很少对许多可能的类型误用发出警告。)

和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()`