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

标签 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 中做同样的事情呢? 我必须写这样的东西来快速实现克隆吗?

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/

相关文章:

ios - Swift 支持继承类型

ios - 根据段选项重新加载 TableView

swift - 从 tableView 中删除 StructItem

swift - 什么是元组和列表?

ios - 重新加载 UITableView 时出现 NSInvalidArgumentException

ios - ObjC 对象上的公共(public) swift 函数是动态还是静态调度的?

ios - Swift - 如何以编程方式旋转 UITableViewHeader 中的 UIImageView

xcode - AVAudioPlayer 和 SKAction.playSoundFileNamed(...) 导致内存泄漏

ios - 设备锁定时 CallKit 不显示传入 UI

ios - 找不到 'ABPeoplePickerNavigationControllerDelegate' 的协议(protocol)声明