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