如何将非托管<CFData>转换为NSData?

use*_*888 6 swift xcode6

我需要将Objective-C转换为Swift以从通讯簿中获取联系人的图像.但是,我得到一个错误与投从CFDataNSData,我不知道如何使这项工作.我该怎么做才能使这项工作正常进行?

在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;
Run Code Online (Sandbox Code Playgroud)

在Swift中:

var image: UIImage!

if ABPersonHasImageData(person) {
    var imgData = (ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize))
    image = UIImage.imageWithData(imgData) //Here get the error 
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 7

使用Cocoa数据类型中所述,您必须使用takeUnretainedValue()或将非托管对象转换为内存管理对象takeRetainedValue().在你的情况下

if (ABPersonHasImageData(person)) {
    let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize).takeRetainedValue()
    let image = UIImage(data: imgData)
}
Run Code Online (Sandbox Code Playgroud)

因为ABPersonCopyImageDataWithFormat()返回一个(+1)保留值.