6

我正在尝试从 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 '&'
)

来源:此答案中的示例代码。

4

1 回答 1

11

(好的,所以一段时间内没有人添加任何新见解,所以我将用我上次编辑的内容回答我自己的问题:)

答案:忘记错误参数。我似乎将地址取了两次(即指向指针的指针)。相反,我应该这样做:

let accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'

let allocator:CFAllocator!         = kCFAllocatorDefault
let protection:AnyObject!             = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.userPresence 

let accessControlRef = SecAccessControlCreateWithFlags(
        allocator,
        protection,
        flags,
        accessControlError // <- Notice the lack of '&'
) 
于 2015-08-27T05:44:39.673 回答