Suppose you want to keep track of one or more unique identifier(s). In this case, A
has two properties that are considered unique to A
, while B
has only one property that is unique to B
.
protocol HavingUID {
// Some way to use KeyPath?
}
struct A : HavingUID {
var unique1 : String
var unique2 : Int
}
struct B : HavingUID {
var unique1 : Double
}
let a1 = A(unique1:"val", unique2: 1)
let a2 = A(unique1:"val", unique2: 2)
let b1 = B(unique1:0.5)
let b2 = B(unique1:0.0)
let b3 = B(unique1:0.2)
let arrA : [HavingUID] = [a1,a2]
let arrB : [HavingUID] = [b1,b2,b3]
// How to check arrA and arrB for duplicate UID properties?
If there was just one unique key, we could do something like:
protocol HavingUID {
typealias UID
static var uidKey : KeyPath<Self, UID> {get}
}
struct A : HavingUID {
static var uidKey = A.\unique1
var unique1 : String
}
struct B : HavingUID {
static var uidKey = B.\uniqueB
var uniqueB : Int
}
...but that limits me to one key.
Any time you need to use unique identifiers, you definitely should keep track of them with global structs or enums. Here are two easy ways to do this:
Structs:
Enums: