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
source share
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
source
 if let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize)?.takeUnretainedValue() { if let image = UIImage(data: imgData) { //Here your UIImage } } 
+2
source

Source: https://habr.com/ru/post/973706/


All Articles