我想编写一个为所有Equatable
结构定义的部分比较函数,它能够比较两个结构实例,但忽略使用参数指定的任何属性。例如,独角兽运算符(
)表示我缺少的内容:
struct Struct1: Equatable {
x: Int
y: Int
z: Int
}
func compare<T: Equatable>(_ a: T, _ b: T, ignoring ignoredProperties: [Property]) { // N.B. “Property” is a made-up type.
var alteredA = a
for property in ignoredProperties {
alteredA property = b property
}
return alteredA == b
}
let s1 = Struct1(x:1, y:2, z:3)
let s2 = Struct1(x:1, y:2, z:4) // s2 is the same as s1, except for the value of property “z”
compare(s1, s2, ignoring: []) // -> false
compare(s1, s2, ignoring: [Property(Struct1.z)]) // -> true
我可以使用哪些内容代替
和Property
?
N.B。我不需要在运行时指定被忽略的属性 - 在这个例子中,它们实际上可以在编译时被识别。
N.B。 2.如果我需要将我的结构改为一个类,那就这样吧,但我真的不知道如何使用类来做我需要的东西。
答案 0 :(得分:2)
您可以将属性键路径传递给函数并使用它们:
class Person: NSObject {
dynamic var firstName: String = ""
dynamic var lastName: String = ""
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
}
func setProperty<T: NSObject>(object: T, path: String, value: Any) {
object.setValue(value, forKey: path)
}
let firstNamePath = #keyPath(Person.firstName)
let chris = Person(firstName: "chris", lastName: "jones")
setProperty(object: chris, path: firstNamePath, value: "notChrisAnyMore")
print(chris.firstName)