2017-07-26 39 views
0

我有一个初始化,在一个类的实例需要(我希望每个人都知道这意味着它的传递通过引用)斯威夫特复印

我希望能够复制对象并存储在两个类的实例变量上,这样,我有一个函数可以用作“重置”,它将设置我对某个点所做的​​任何更改,回到之前的状态。

所以像:

convenience init(_ item:Item?){ 
    self.init() 
    self.item = item 
    self.undoItem = item 
} 


func reset(){ 
    self.item = self.undoItem 
    self.reloadInfo() 
} 

我没有什么应该是一个比较直接的解决方案很成功。我对Swift和iOS开发太新了。

+0

这两种方法在哪些类中?使用这些方法演示问题的示例代码更新您的问题。说明代码实际发生了什么,以及你想要发生什么。 – rmaddy

+0

我不明白为什么这很难理解。我想知道如何能够将项目的副本传递给init,以便我可以将它存储到两个不同的位置,以便它们不共享相同的引用。这会让我对其中的一个进行更改,如果用户决定撤消这些更改,则可以使用重置功能来实现此功能。 – daredevil1234

+1

确保'Item'有一个复制初始值设定项,并使用它。请注意,如果您没有进行深层复制,如果任何属性都是引用类型,则可能仍然存在问题,因为如果制作浅度副本,则会有两个不同的“Item”对象,但它们都会引用到其引用类型成员变量的相同实例。 –

回答

0

来解决写了操场以下(与一个朋友的帮助下):

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中,因为它们是一个引用类型(并且我不确定是否可以解引用它或什么),所以基本上每次都必须为对象编写一个自定义的复制函数。好吧,现在我写了这个,所以只要你使用NSObject的一个子类并使用这个协议,你就会好起来的。

这已经完全按照我的需要在我的代码中工作

0

使用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.value1item2.value20。 下面行创建的ITEM1副本,并把它分配给ITEM2:

var item2 = item1 

从该线到item2任何变化不会反映在item1

结论

您的问题可以通过定义Itemstruct