I\'m using an Objective-C class in my Swift project via a bridging header. The method signature looks something like this:
- (CFArrayRef)someMethod:(someType
An Unmanaged
is a wrapper for an actual CF value. (Sort of like an optional.) It's there because ARC can't tell from looking at the declaration of someMethod:
whether that method retains the value it returns.
You unwrap an Unmanaged
by telling ARC what memory management policy to use for the value inside. If someMethod
calls CFRetain
on its return value:
let cfArr = myInstance.someMethod(someValue).takeRetainedValue()
If it doesn't:
let cfArr = myInstance.someMethod(someValue).takeUnretainedValue()
After you do that, cfArr
is a CFArray
, so you can use the bridging tricks from the other questions you linked to for accessing it like a Swift array.
If you own the code for someMethod
you can change it a bit to not need this. There's a couple of options for that:
CF_RETURNS_RETAINED
or CF_RETURNS_NOT_RETAINED
to tell the compiler what memory behavior is neededNSArray
and return that--it'll automatically become an [AnyObject]
array in Swift. As explained in Working with Core Foundation Types, there are two possible solutions when you return a Core Foundation object from your own function that is imported in Swift:
Annotate the function with CF_RETURNS_RETAINED
or CF_RETURNS_NOT_RETAINED
.
In your case:
- (CFArrayRef)someMethod:(someType)someParameter CF_RETURNS_NOT_RETAINED;
Or convert the unmanaged object to a memory managed object with takeUnretainedValue()
or takeRetainedValue()
in Swift. In your case:
var cfArr = myInstance.someMethod(someValue).takeUnretainedValue()