属性 别名(可以说是可识别的最优雅的解决方案)
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
}
如果我想遵守某个协议,而该协议定义了一个我不喜欢的 属性 名称怎么办?
例如:
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
}