How to convert unmanaged <CFData> to NSData?
I need to convert my Objective-C to Swift in order to get a contact image from the address book. But I get an error for cast from CFData to NSData , and I don't know how to do it. What can I do to make this work right?
In Objective-C:
ABRecordID contactID = ABRecordGetRecordID(contactRef); ABAddressBookRef addressBook = ABAddressBookCreate(); ABRecordRef origContactRef = ABAddressBookGetPersonWithRecordID(addressBook, contactID); if (ABPersonHasImageData(origContactRef)) { NSData *imgData = (NSData*)ABPersonCopyImageDataWithFormat(origContactRef, kABPersonImageFormatOriginalSize); img = [UIImage imageWithData: imgData]; [imgData release]; } CFRelease(addressBook); return img; In Swift:
var image: UIImage! if ABPersonHasImageData(person) { var imgData = (ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize)) image = UIImage.imageWithData(imgData) //Here get the error } +6
2 answers
As explained in Working with Cocoa Data Types , you need to convert an unmanaged object to a memory managed object using takeUnretainedValue() or takeRetainedValue() . In your case
if (ABPersonHasImageData(person)) { let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize).takeRetainedValue() let image = UIImage(data: imgData) } because ABPersonCopyImageDataWithFormat() returns (+1) the stored value.
+7