I'm accessing a C language struct in my Swift project that stores data as a tuple and I want to iterate over it.
let tuple = (1, 2, 3, 4, 5)
AFAIK, I have two options. The first is to mirror the tuple so that I can map its reflection into an array:
let tupleMirror = Mirror(reflecting: tuple)
let tupleArray = tupleMirror.children.map({ $0.value }) as! [Int]
And the second option is to translate it into an array using manual memory management with something like an unsafe buffer pointer. From all that I've read, it's usually suggested to avoid the manual-memory route if possible and Mirror certainly appears to do that. Is mirroring a safe/reliable way to convert a tuple to an array? Or is there a better approach to translating the tuple into an array or even iterating over the tuple itself?
Mirror is fiiiiiiiiiiiiine.
extension Array {
init?<Subject>(mirrorChildValuesOf subject: Subject) {
guard let array = Mirror(reflecting: subject).children.map(\.value) as? Self
else { return nil }
self = array
}
}
XCTAssertEqual(
Array( mirrorChildValuesOf: (1, 2, 3, 4, 5) ),
[1, 2, 3, 4, 5]
)
XCTAssertNil(
[Int]( mirrorChildValuesOf: (1, 2, "3", 4, 5) )
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With