var keyCallbacks = kCFTypeDictionaryKeyCallBacks
var valueCallbacks = kCFTypeDictionaryValueCallBacks
var keys = [Unmanaged.passUnretained(kSecClass).toOpaque(), Unmanaged.passUnretained(kSecAttrApplicationTag).toOpaque(), Unmanaged.passUnretained(kSecAttrKeyType).toOpaque(), Unmanaged.passUnretained(kSecReturnRef).toOpaque()]
var values = [Unmanaged.passUnretained(kSecClassKey).toOpaque(), Unmanaged<AnyObject>.passUnretained(privateTag as AnyObject).toOpaque(), Unmanaged.passUnretained(kSecAttrKeyTypeRSA).toOpaque(), Unmanaged.passUnretained(kCFBooleanTrue).toOpaque()]
// let queryKey = CFDictionaryCreate(kCFAllocatorDefault, &keys, &values, 4, &keyCallbacks, &valueCallbacks)//Error-- for "keys" this error show cannot pass immutable value of type 'UnsafeRawPointer?' as inout argument.
let queryKey = CFDictionaryCreate(kCFAllocatorDefault, &keys, &values, 4, &keyCallbacks, &valueCallbacks)
// Get the key.
var extractedItem: AnyObject?
let resultCode = SecItemCopyMatching(queryKey, &extractedItem)//cannot pass immutable value of type 'UnsafeRawPointer?' as inout argument
guard let keyItem = extractedItem, resultCode == noErr else {
return nil
不要在 Swift 中使用 CFDictionary
。这不是不可能,但不是值得麻烦。 CFDictionary
免费电话桥接NSDictionary
反过来可以从 Swift Dictionary
实例化:
let query: NSDictionary = [
kSecClass: kSecClassKey,
kSecAttrApplicationTag: privateTag,
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecReturnRef: true
]
var extractedItem: AnyObject?
let resultCode = SecItemCopyMatching(query, &extractedItem)