我正在尝试从 swift 代码中调用 Security.framework 中的函数。如果我这样调用函数,请暂时忘记“错误输出”(最后一个)参数:
let accessControlRef = SecAccessControlCreateFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
SecAccessControlCreateFlags.UserPresence,
nil
)
我得到以下错误:
找不到接受“(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)”类型参数列表的“SecAccessControlCreateFlags”类型的初始化程序
...但是,如果我将代码重新格式化为以下内容:
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
nil
)
(特定类型——例如CFAllocatorRef
——取自 Xcode 的自动完成功能原型)......它编译没有问题。这是怎么回事?
接下来是错误参数。我应该通过什么?迁移我的 Objective-C 代码时,我很想传递以下变量(&
当然,前面带有 ):
var accessControlError:CFErrorRef! = nil
...这给出了错误:
无法使用类型为“(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)”的参数列表调用“SecAccessControlCreateWithFlags”
相反,如果我传递以下变量(同样,前面带有地址运算符):
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
(与原型自动完成建议的类型相同),我得到:
无法使用类型为“(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout UnsafeMutablePointer?>)”的参数列表调用“SecAccessControlCreateWithFlags”
......那么,什么给了?
编辑:忘记错误参数。我似乎将地址取了两次(即指向指针的指针)。相反,我应该这样做:
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
accessControlError // <- Notice the lack of '&'
)
来源:此答案中的示例代码。