我想從swift代碼中調用Security.framework中的函數。忘記了一秒鐘 「錯誤出」(去年)的參數,如果我調用該函數是這樣的:Swift中的SecAccessControlCreateWithFlags()
let accessControlRef = SecAccessControlCreateFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
SecAccessControlCreateFlags.UserPresence,
nil
)
我GE THT efollowing錯誤:
Cannot find an initializer for type 'SecAccessControlCreateFlags' that accepts an argument list of type '(CFAllocator!, CFStringRef, SecAccessControlCreateFlags, nil)'
...但是,如果我格式化我的代碼如下:
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
...這給出了錯誤:
Cannot invoke 'SecAccessControlCreateWithFlags' with an argument list of type '(CFAllocatorRef!, AnyObject!, SecAccessControlCreateFlags, inout CFErrorRef!)'
相反,如果我通過以下變量(再次,與運營商的-的地址前綴):
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
(由原型自動完成建議的相同型號),我得到:
Cannot invoke 'SecAccessControlCreateWithFlags' with an argument list of type '(CFAllocatorRef!, AnyObject!, SecAccessControlCreateFlags, inout UnsafeMutablePointer?>)'
......那麼,什麼給了?編輯:忘記錯誤參數。我好像是兩次取地址(即指向指針的地址)。相反,我應該這樣做:
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 '&'
)
來源:this answer內的示例代碼。
FWIW,您還可以使用「var error:Unmanaged?」並傳遞參考「&錯誤」參考:https://developer.apple.com/videos/play/wwdc2015/706/ –
qnoid