1
我正在寫一個OS X應用程序,應該保持一個自定義的鑰匙串,我試圖使用安全框架的API來創建鑰匙串,但是,我似乎無法得到它在Swift下編譯。使用從Swift SecKeychainCreate
這裏是我有,假設path
包含對可能存在的鑰匙扣的路徑:
let pathName = (path as NSString).UTF8String
var keychain: Unmanaged<SecKeychain>?
var status = withUnsafeMutablePointer(&keychain) { pointer in
SecKeychainOpen(pathName, pointer)
}
if status != errSecSuccess {
status = withUnsafeMutablePointer(&keychain) { pointer in
SecKeychainCreate(pathName, UInt32(0), nil, false, nil, pointer)
}
}
編譯器抱怨在SecKeychainCreate呼叫的類型,但是,我不明白我在做什麼錯誤。
Cannot invoke 'withUnsafeMutablePointer' with an argument list of type '(inout Unmanaged<SecKeychain>?, (_) -> _)'
如果我稍微修改了第二封,我得到這個編譯器錯誤:
Cannot invoke 'SecKeychainCreate' with an argument list of type '(UnsafePointer<Int8>, UInt32, nil, Bool, nil, (UnsafeMutablePointer<Unmanaged<SecKeychain>?>))'
我感謝所有的建議。
感謝您的深入分析,因爲我懷疑這是一件容易遺漏的事情。我希望編譯器能更詳細地瞭解錯誤... –
@亨利諾馬克:不客氣。 - 是的,錯誤的參數類型可能難以檢測,甚至更難以檢測到。 Swift編譯器還有改進的空間!有時可以使用方法的自動完成(或跳轉到定義)並檢查每個參數。 –
你提到文檔描述了你必須使用'SecKeychainGetStatus()',因爲'SecKeychainOpen()'總是成功的。你在哪裏找到這個文檔?我發現這是真實的,但無法找到任何官方提及的這種行爲。 – drootang