Swift 使用协议定义具有不同值的密钥路径集合

Swift 使用协议定义具有不同值的密钥路径集合,swift,keypaths,swift-keypath,Swift,Keypaths,Swift Keypath,假设您希望跟踪一个或多个唯一标识符。在这种情况下,A有两个属性被认为是A所独有的,而B只有一个属性是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(uniqu

假设您希望跟踪一个或多个唯一标识符。在这种情况下,
A
有两个属性被认为是
A
所独有的,而
B
只有一个属性是
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?
如果只有一个唯一的密钥,我们可以执行以下操作:

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
}
protocol HavingUID{
类型别名UID
静态变量uidKey:KeyPath{get}
}
结构A:HavingUID{
静态变量uidKey=A。\unique1
变量unique1:字符串
}
结构B:HavingUID{
静态变量uidKey=B.\uniqueB
唯一变量:Int
}

…但这将我限制为一个键。

任何时候需要使用唯一标识符时,一定要使用全局结构或枚举跟踪它们。以下是两种简单的方法:

结构:

struct UniqueIdentifiers {
    static let id1 = "identifier_one"
    static let id2 = "identifier_two"
    static let id3 = "identifier_three"
}

let currentID = UniqueIdentifiers.id1
枚举:

enum UniqueIdentifiers: String {
    case id1 = "identifier_one"
    case id2 = "identifier_two"
    case id3 = "identifier_three"
}

let currentID = UniqueIdentifiers.id1.rawValue

当你说“A有两个唯一的属性”时,这是否意味着如果两个属性中的任何一个不同,那么两个
A
s就被认为是不同的?或者这是否意味着两个
A
s当且仅当两个属性不同时才被认为是不同的?我真的不明白为什么要使用键路径。你就不能做点什么吗?@sweeper这对问题来说并不重要,但是为了这个例子,让我们简单地说,一个属性只能在不同的实例中与同一个属性进行比较。
可识别
不足的原因是它仅限于一个
id
属性。我正在考虑一个案例,其中有多个唯一的属性,甚至可能没有命名为“id”。