我希望能够在Swift中复制一个自定义类。到目前为止,一切顺利。在Objective-C中,我只需要实现NSCopying
协议,这意味着实现copyWithZone
。
例如,我有一个名为Value
的基类,它存储了一个NSDecimalNumber
。
func copyWithZone(zone: NSZone) -> AnyObject! {
return Value(value: value.copy() as NSDecimalNumber)
}
在Objective-C中,我可以很容易地调用copy
来复制我的对象。在Swift中,似乎没有办法调用copy
。即使不需要区域,我真的需要调用copyWithZone
吗?我需要传递哪个区域作为参数?
9条答案
按热度按时间vh0rcniy1#
copy
方法在NSObject
中定义。如果您的自定义类不是从NSObject
继承的,则copy
将不可用。可以按以下方式为任何对象定义
copy
:我猜
copy
并不是一种纯粹的Swift复制对象的方式,在Swift中,它可能是创建复制构造函数(一种接受相同类型对象的初始化器)的更常见方式。bpzcxfmw2#
嗯,有一个非常简单的解决方案,你不必创建根类。
现在,如果你想让你的定制类能够复制,你必须使它符合
Copyable
协议并提供init(instance: Self)
实现。最后,您可以在
A
类的任何示例上使用func copy() -> Self
来创建它的副本。iqih9akk3#
您可以编写自己的复制方法
这样做的好处是当你在你的项目中使用子类时,你可以调用“copy”命令,它会复制子类。如果你只是初始化一个新的子类来复制,你还必须为每个对象重写那个类...
我在创建纸牌游戏时特别使用了这一点,因为无论你在玩什么游戏,你都将需要复制“棋盘”,而棋盘是一个更通用的棋盘的子类。
mftmpeh84#
在我的例子中,对象链很大,而且是嵌套的,所以我在寻找更简单的解决方案。
核心概念非常简单...通过新初始化复制数据,我使用
Encode
和Decode
深度复制整个对象,因为我的对象已经符合**Codable
**,简单示例:
重构(一般解决方案):
为了简化将来的情况,我们可以创建一个提供
copy
函数的协议。copy
函数。*对于
Codable
对象,我们可以提供一个默认的实现,这样它就可以随时使用。现在,我们可以使
Codable
对象符合Copyable
协议,并立即开始使用它。示例:
我们也可以将
Codable
对象的Array
与Copyable
一致,并立即访问copy
函数:示例:
x6h2sr285#
IMO,实现这一点的最简单方法是:
在结构中实现为:
并且,在类中,为:
和这样的基类的子类中,如:
如果希望能够复制可复制类型的数组:
它允许您执行简单的代码,例如:
mspsb9vt6#
在我看来,更快捷的方法是在允许定义方法复制的返回类型的可复制协议中使用关联类型。其他方法不允许复制对象树,如:
8dtrkrch7#
swift中的可复制示例
不同的形状使用相同的样式,但每个样式都使用一个styl.copy()调用来创建一个唯一的示例,然后在这个副本上设置一个新的渐变,而不是在原始引用上,如下所示:
上面示例的代码如下所示:
复制调用实际上是在mix()方法中完成的,这样做是为了使代码更加紧凑,并且可以方便地立即返回示例。PERMALINK用于本示例的所有支持类:https://github.com/eonist/swift-utils
pxyaymoc8#
仅当使用ObjectMapper库时:这样做
eblbsuwk9#
Swift making copies of passed class instances
如果您在这里使用已接受答案中的代码(OP回答了他们自己的问题),只要您的类是NSObject的子类,并且在该帖子中使用复制协议,它将通过调用copyOfValues()函数按预期工作。
这样,就没有了繁琐的设置或复制功能,您无需将所有示例变量分配给新示例。
我应该知道,我写了代码,并测试了它XD