(Swift) 实现深拷贝

2022-11-14  本文已影响0人  布呐呐u

方式一)遵循 NSCopying 系统协议

func copy(with zone: NSZone? = nil) -> Any
class TestA: NSCopying {
    var name: String
    init(name: String) { self.name = name }
    
    func copy(with zone: NSZone? = nil) -> Any { TestA(name: name) }
}

方式二)遵循 Copying 自定义协议

protocol Copying { init(obj: Self) }
protocol Copying { init(obj: Self) }
extension Copying { var copy: Self { Self.init(obj: self) } }

class TestB: Copying {
    var name: String
    init(name: String) { self.name = name }
    
    required init(obj: TestB) { self.name = obj.name }
}

方式三)遵循 Codable 系统协议

func copy<T: Codable>(_ obj: T) -> T?
func codableCopy<T: Codable>(_ obj: T) -> T? {
    do{
        let jsonData = try JSONEncoder().encode(obj)
        return try JSONDecoder().decode(T.self, from: jsonData)
    }
    catch {
        print("Decode failed. \(error)"); return nil
    }
}

class TestC: Codable {
    var name: String
    init(name: String) { self.name = name }
}
上一篇 下一篇

猜你喜欢

热点阅读