Implementing copy() in Swift

前端 未结 10 1460
难免孤独
难免孤独 2020-11-27 15:31

I want to be able to copy a custom class in Swift. So far, so good. In Objective-C I just had to implement the NSCopying protocol, which means implementing

10条回答
  •  旧巷少年郎
    2020-11-27 16:13

    In my opinion, more Swifty way is to use associated type in Copyable protocol which allows define return type for method copy. Other ways don't allow to copy an object tree like this:

    protocol Copyable {
        associatedtype V
        func copy() -> V
        func setup(v: V) -> V
    } 
    
    class One: Copyable {
        typealias T = One
        var name: String?
    
        func copy() -> V {
            let instance = One()
            return setup(instance)
        }
    
        func setup(v: V) -> V {
            v.name = self.name
            return v
        }
    }
    
    class Two: One {
        var id: Int?
        override func copy() -> Two {
            let instance = Two()
            return setup(instance)
        }
    
        func setup(v: Two) -> Two {
            super.setup(v)
            v.id = self.id
            return v
        }
    }
    
    extension Array where Element: Copyable {
        func clone() -> [Element.V] {
            var copiedArray: [Element.V] = []
            for element in self {
                copiedArray.append(element.copy())
            }
            return copiedArray
        }
    }
    
    let array = [One(), Two()]
    let copied = array.clone()
    print("\(array)")
    print("\(copied)")
    

提交回复
热议问题