Swift 复制通过的 class 个实例
Swift making copies of passed class instances
我有一个接受 class 实例的初始化(我希望每个人都知道这意味着它是按引用传递)
我希望能够复制对象并将其存储在两个 class 实例变量中,这样,我就有一个函数可以充当 "reset" 它将设置的位置我对某一点所做的任何更改都会恢复到以前的状态。
所以像这样:
convenience init(_ item:Item?){
self.init()
self.item = item
self.undoItem = item
}
func reset(){
self.item = self.undoItem
self.reloadInfo()
}
我应该是一个相对直接的解决方案,但没有取得太大的成功。我对 Swift 和 iOS 开发太陌生了。
使用 swift 结构可能是您的一种选择。
struct Item {
//
}
Swift中的结构是值类型,它们是按值而不是引用复制的。
示例
struct Item {
var value: Int = 1
}
var item1 = Item()
var item2 = item1
item2.value = 20
print("\(item1.value)") // 1
print("\(item2.value)") // 20
在上面的例子中 item1.value
是 1
而 item2.value
是 20
。
以下行创建了 item1 的副本并将其分配给 item2:
var item2 = item1
从这一行开始,对 item2
的任何更改都不会反映在 item1
中。
结论
您的问题可以通过将 Item
定义为 struct
来解决
在 playground 中(在朋友的帮助下)写了以下内容:
protocol Copyable {
func copyOfValues() -> AnyObject
}
extension Copyable where Self: NSObject {
func copyOfValues() -> AnyObject{
var copyOfOriginal = Self()
let mirror = Mirror(reflecting: self)
for (label, value) in mirror.children {
if let label = label {
copyOfOriginal.setValue(value, forKey: label)
}
}
return copyOfOriginal
}
}
class Test: NSObject, Copyable {
var a = 1
var b = 2
}
var test = Test()
var copy = test.copyOfValues() as! Test
print(dump(test))
print(dump(copy))
copy.a = 10
print(dump(test))
print(dump(copy))
这是一个不错且简单的函数,因此我可以在 swift 中获取我的 class 个实例的副本。在 swift 中,由于它们是引用类型(我不确定您是否可以取消引用它或诸如此类),您基本上每次都必须为您的对象编写一个自定义复制函数。好吧,现在我写了这个,所以只要你使用 NSObject 的子class 并使用这个协议,你就可以了。
这完全符合我在代码中的需要
我有一个接受 class 实例的初始化(我希望每个人都知道这意味着它是按引用传递)
我希望能够复制对象并将其存储在两个 class 实例变量中,这样,我就有一个函数可以充当 "reset" 它将设置的位置我对某一点所做的任何更改都会恢复到以前的状态。
所以像这样:
convenience init(_ item:Item?){
self.init()
self.item = item
self.undoItem = item
}
func reset(){
self.item = self.undoItem
self.reloadInfo()
}
我应该是一个相对直接的解决方案,但没有取得太大的成功。我对 Swift 和 iOS 开发太陌生了。
使用 swift 结构可能是您的一种选择。
struct Item {
//
}
Swift中的结构是值类型,它们是按值而不是引用复制的。
示例
struct Item {
var value: Int = 1
}
var item1 = Item()
var item2 = item1
item2.value = 20
print("\(item1.value)") // 1
print("\(item2.value)") // 20
在上面的例子中 item1.value
是 1
而 item2.value
是 20
。
以下行创建了 item1 的副本并将其分配给 item2:
var item2 = item1
从这一行开始,对 item2
的任何更改都不会反映在 item1
中。
结论
您的问题可以通过将 Item
定义为 struct
在 playground 中(在朋友的帮助下)写了以下内容:
protocol Copyable {
func copyOfValues() -> AnyObject
}
extension Copyable where Self: NSObject {
func copyOfValues() -> AnyObject{
var copyOfOriginal = Self()
let mirror = Mirror(reflecting: self)
for (label, value) in mirror.children {
if let label = label {
copyOfOriginal.setValue(value, forKey: label)
}
}
return copyOfOriginal
}
}
class Test: NSObject, Copyable {
var a = 1
var b = 2
}
var test = Test()
var copy = test.copyOfValues() as! Test
print(dump(test))
print(dump(copy))
copy.a = 10
print(dump(test))
print(dump(copy))
这是一个不错且简单的函数,因此我可以在 swift 中获取我的 class 个实例的副本。在 swift 中,由于它们是引用类型(我不确定您是否可以取消引用它或诸如此类),您基本上每次都必须为您的对象编写一个自定义复制函数。好吧,现在我写了这个,所以只要你使用 NSObject 的子class 并使用这个协议,你就可以了。
这完全符合我在代码中的需要