Swift:向下转换一个硬拷贝对象,获得实例变量的默认值?

时间:2018-10-10 06:42:52

标签: ios iphone swift oop

我试图通过序列化和反序列化,使用自定义实例变量来精确复制UIView子类对象。

在复制之前,我给实例变量分配了一个不同于默认值的值。

为什么我要找回实例变量的默认值而不是我分配的默认值?

请参阅下面的演示代码。

谢谢!

class CustomUIView: UIView {
    var insVar = 5
}


extension UIView {
    func duplicate() -> UIView {
        let archive = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: archive) as! UIView
    }
}



let c1 = CustomUIView()
c1.insVar = 10

let c2 = c1.duplicate() as! CustomUIView

print(c1.insVar)  // get 10
print(c2.insVar)  // get 5

1 个答案:

答案 0 :(得分:0)

NSKeyedArchiver并不是一种魔术工具,它可以找到类中的所有属性并将其序列化。它调用NSCoding方法,该方法完成了序列化的艰苦工作。

您尚未覆盖init(coder:)encode(with:)。这就是为什么您的媒体资源未存档的原因。

我不特别推荐这种创建UIView的精确副本的方法。 UIView只是显示数据(或模型)的一种方式,因此您可能应该复制数据,然后用新的UIView显示。您可以编写这样的方法:

func createView(thatDisplays data: SomeType) -> CustomUIView {
   // return a new CustomUIView here, configured to display that data...
}

// or as an initialiser:

init(dataToDisplay: SomeType) { ... }

并以此方式创建所有CustomUIView。然后,您将获得几乎完全相同的视图-唯一的区别在于它显示的数据。将相同的数据传递给此方法与复制UIView几乎相同,不是吗?