I have created multiple classes, all of which need to implement the NSCopying protocol, but there are a lot of properties in my classes, is there an easier way?
Below is my current way:
class TestA: NSObject, NSCopying {
var a: CGFloat = 0
var b: CGFloat = 0
required override init() {
}
func copy(with zone: NSZone? = nil) -> Any {
let item = type(of: self).init()
item.a = a
item.b = b
return item
}
}
class TestB: TestA {
var c: CGFloat = 0
var d: CGFloat = 0
override func copy(with zone: NSZone? = nil) -> Any {
let item = super.copy(with: zone) as! TestB
item.c = c
item.b = b
return item
}
}
My thought is, can we take all the properties of the class, automatically create a new object, assign values to the new object?
3
Answers
I think I've found a solution, but I'm not sure if this will have any ill effects. Can someone tell me what's wrong with this。Thanks!
Use the initializer.
Doing it this way doesn’t really save code since you still need an initializer that takes values for all properties, but you do get a simplified
copy
method and another initializer that might be useful in other situations too.You can look at KeyValueCoding package with
KeyValueCoding
protocol which implements enumeration of all properties of an object and setting values by key paths for pure swift classes and structs.Based on it you can implement
Copying
protocol:How it works:
So as you can see this approach works with inherited properties as well.
Moreover it works with structs: