在 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()`
我目前正在将一些 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()`