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中做同样的事情呢? 我必须写这样的东西来实现swift中的克隆吗?
class Person: NSObject, NSCopying {
var age: Int?
func copyWithZone(zone: NSZone) -> AnyObject {
var p = Person()
p.age = self.age
return p
}
}
一个班级,一个成员似乎没问题。但如果我有很多子类,并且每个子类都有不同的成员,那么代码很多,我应该为每个子类实现clone。
在java中,只有一个超类中的克隆方法,它要简单得多。
答案 0 :(得分:1)
在Obj-C中,复制对象的正确方法是使用NSCopying
协议。
在Swift中,您通常应该使用复制构造函数,尽管您可以将NSCopying
用于从NSObject
派生的类。
是的,您必须编写更多代码,但是,Java中的clone
是Java中最严重的OOP问题之一。它设计得不好。它决定要为你复制什么的事实并不是一件好事。
另见How to properly override clone method?
简而言之,在Java中,如果您要实施clone
,则不应该致电Object.clone
。使用构造函数实现对象创建,并自己决定应该复制什么以及如何复制。