As the title suggests, I have a mature data model, and I want to add conformance to Identifiable but (for backwards compatibility reasons) not actually add id as an instance variable
My model object in question already implements Hashable, so plan A was to use the hashValue generate id. Sadly hashValue is an Int and id needs to be a UUID. So how does one convert an Int to a UUID?
As is often the case there was a discussion on StackOverflow offering alternatives. The option that leapt out at me introduced to Swift language options I had never used before.
withUnsafeBytes
is an array ‘operator’ that will (I believe) iterate over all the bytes in the array. load
will pour the bytes into a new object whose type is specified by the as:
parameter. As somebody who has done a small amount of writing c and ZERO c++ this code feels very foreign to me.
I chose to solve my problems with two pieces of code. First I extended Int like this:
extension Int {
public var asID: UUID {
let vals: [Int64] = [Int64(self), 0]
return vals.withUnsafeBytes { $0.load(as: UUID.self) }
}
}
I then added Identifiable conformance like this:
extension Thread: Identifiable {
public var id: UUID {
return self.hashValue.asID
}
}
Solving this problem reminded me just how much complexity there is ‘under the hood’ in almost any code we write. I find it amazing that:
- There are smart people who are well versed in the (obscure?) corners of the software engineering information domain.
- By invoking an appropriate combination of keywords in the search bar, I can be connected to the helpful guidance created by these smart people.
Yay technology!