2017-07-26 43 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