属性 别名(可以说是可识别的最优雅的解决方案)

Property alias (as arguably the most elegant solution for Identifiable)

如果我想遵守某个协议,而该协议定义了一个我不喜欢的 属性 名称怎么办?
例如:

struct Currency: Identifiable {
    let id: String
    let rate: Double
}

但在这种情况下,为 "id" 属性 取一个更有意义的名称会很棒。所以我希望能够做这样的事情:

struct Currency: Identifiable {
    propertyalias iso = id
    let iso: String
    let rate: Double
}

没有"property alias"。

但是,您可以将 属性 包装在计算的 属性 中,您可以根据需要命名。

struct Currency: Identifiable {
    let iso: String
    let rate: Double

    var id: String { 
        iso
    }
}

Swift 5.2+
的解决方案 灵感来自 How Swift keypaths let us write more natural code

protocol MyIdentifiable: Identifiable {
    associatedtype ID
    static var idKey: KeyPath<Self, ID> { get }
}

extension MyIdentifiable {
    var id: ID {
        self[keyPath: Self.idKey]
    }
}

struct Currency: MyIdentifiable {
    static let idKey = \Self.iso
    let iso: String
    let rate: Double
}