class Person implements Cloneable {
int age;
Person(int age) {
this.age = age;
}
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
public static void main(String[] args) {
Person p = new Person(0);
Person p1 = (Person) p.clone();
p.age = 10;
System.out.println(p.age + " " + p1.age);
}
结果是 10 0 在java中,我们可以简单地使用super.clone()来实现克隆。 但我怎样才能在 swift 中做同样的事情呢? 我必须写这样的东西来快速实现克隆吗?
class Person: NSObject, NSCopying {
var age: Int?
func copyWithZone(zone: NSZone) -> AnyObject {
var p = Person()
p.age = self.age
return p
}
}
一个类(class),一名成员似乎没问题。但是如果我有很多子类,并且每个子类都有不同的成员,那么代码就会很多,我应该为每个子类实现克隆。
在java中,父类(super class)中只有一个clone方法,比较简单。
最佳答案
在 Obj-C 中,复制对象的正确方法是使用 NSCopying
协议(protocol)。
在 Swift 中,您通常应该使用复制构造函数,尽管您可以对从 NSObject
派生的类使用 NSCopying
。
是的,你必须编写更多代码,但是,Java中的克隆
是Java中最严重的OOP问题之一。它设计得不好。事实上,它决定将为您复制什么内容,这并不是一件好事。
另请参阅How to properly override clone method?
简而言之,在 Java 中,如果您要实现 clone
,则不应调用 Object.clone
。使用构造函数实现对象创建,并自行决定应该复制什么以及如何复制。
关于swift - 如何在 swift 中克隆像 Java 这样的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30775560/