gpt4 book ai didi

objective-c - 在 Swift 中使用对 CFPropertyListRef 的引用

转载 作者:行者123 更新时间:2023-11-28 06:37:32 37 4
gpt4 key购买 nike

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

MyFunction(CFPropertyListRef list, CFPropertyListFormat *fmt);

在 Objective-C 中,我通过以下方式调用它

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

通过“生成的界面”我可以看到 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 中使用对 CFPropertyListRef 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38789877/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com