2015-07-21 79 views
3

我想從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內的示例代碼。

回答

5

(OK,所以沒有人添加任何新的見解在一段時間,所以我會回答我的問題與我的最後一次編輯:)內容

答:忘掉錯誤的參數。我好像是兩次取地址(即指向指針的地址)。相反,我應該這樣做:

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 '&' 
) 
+6

FWIW,您還可以使用「var error:Unmanaged ?」並傳遞參考「&錯誤」參考:https://developer.apple.com/videos/play/wwdc2015/706/ – qnoid