Your code shown above contains a workaround needed till Swift 1.1. (Seems to work in Swift 1.2 or 2, but not recommended.)
Here's a code I use in Swift 1.2 (works in Swift 2, I believe), though, I'm not sure you find this cleaner.
let keychainQuery: [NSObject: AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : serviceName,
kSecAttrAccount : userAccount,
kSecReturnData : kCFBooleanTrue,
kSecMatchLimit : kSecMatchLimitOne]
var dataTypeRef: Unmanaged<AnyObject>?
let status = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if status == errSecSuccess,
let retrievedData = dataTypeRef?.takeRetainedValue() as! NSData? {
//process retrivedData
} else {
//process error
}
UPDATE for Swift 2.2 (or update was needed for former versions...)
I believe this compiles and works in Swift 2.2:
let keychainQuery: [NSObject: AnyObject] = [
kSecClass : kSecClassGenericPassword,
kSecAttrService : serviceName,
kSecAttrAccount : userAccount,
kSecReturnData : kCFBooleanTrue,
kSecMatchLimit : kSecMatchLimitOne]
var dataTypeRef: AnyObject?
let status = SecItemCopyMatching(keychainQuery, &dataTypeRef)
if status == errSecSuccess,
let retrievedData = dataTypeRef as! NSData? {
//process retrivedData
} else {
//process error
}