Nic*_*ari 5 security-framework core-foundation ios swift
我试图从快速代码中调用Security.framework中的函数.忘记"错误输出"(最后)参数一秒,如果我调用这样的函数:
let accessControlRef = SecAccessControlCreateFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
SecAccessControlCreateFlags.UserPresence,
nil
)
Run Code Online (Sandbox Code Playgroud)
我发现以下错误:
找不到类型为'SecAccessControlCreateFlags'的初始值设定项,它接受类型'(CFAllocator!,CFStringRef,SecAccessControlCreateFlags,nil)'的参数列表
...但是,如果我将代码重新格式化为以下内容:
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
nil
)
Run Code Online (Sandbox Code Playgroud)
(特定类型-eg,CFAllocatorRef- 取自Xcode自动完成时的函数原型)...它编译没有问题.这是怎么回事?
接下来是错误参数.我应该通过什么?迁移我的Objective-C代码,我很想传递以下变量(&当然是前缀):
var accessControlError:CFErrorRef! = nil
Run Code Online (Sandbox Code Playgroud)
...给出了错误:
无法使用类型'(CFAllocatorRef!,AnyObject!,SecAccessControlCreateFlags,inout CFErrorRef!)的参数列表调用'SecAccessControlCreateWithFlags'
相反,如果我传递了以下变量(再次使用address-of运算符):
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
Run Code Online (Sandbox Code Playgroud)
(与原型自动完成建议的类型相同),我得到:
无法使用类型'(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 '&'
)
Run Code Online (Sandbox Code Playgroud)
来源:此答案中的示例代码.
(好的,所以没有人在一段时间内添加任何新的见解,所以我将用我上次编辑的内容回答我自己的问题:)
解答:忘记错误参数.我好像在拿地址两次(即指向指针的指针).相反,我应该这样做:
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 '&'
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |