如何在swift中克隆像Java这样的对象

时间:2015-06-11 08:30:59

标签: swift

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中,只有一个超类中的克隆方法,它要简单得多。

1 个答案:

答案 0 :(得分:1)

在Obj-C中,复制对象的正确方法是使用NSCopying协议。 在Swift中,您通常应该使用复制构造函数,尽管您可以将NSCopying用于从NSObject派生的类。

是的,您必须编写更多代码,但是,Java中的clone是Java中最严重的OOP问题之一。它设计得不好。它决定要为你复制什么的事实并不是一件好事。

另见How to properly override clone method?

简而言之,在Java中,如果您要实施clone,则不应该致电Object.clone。使用构造函数实现对象创建,并自己决定应该复制什么以及如何复制。