[英]Questions about Copy in Swift
例如,我有兩個ViewController調用“列表”和“詳細信息”。 ListViewController有一個數據數組,當我單擊ListViewController的單元格時,ListViewController將推送DetailViewController並將數據傳遞給DetailViewController,如下所示:
let model = gMetaArray[indexPath.row]
let vc = R.storyboard.main.comicDetailController()!
vc.gMetaModel = model
navigationController?.pushViewController(vc, animated: true)
因此,在DetailViewController中,我得到了數據並使用了它:
guard var data = gMetaModel else { return }
data.sdatas.append(SDataModel())
當我修改數據時,ListViewController的數據數組將更改。
為什么? 當我將數據傳遞給DetailViewController時,不會發生深度復制嗎? 當我使用guard var data = gMetaModel else { return }
,不會發生深度復制嗎?
如果沒有發生,該如何深度復制數據?
您的gMetaModel
可能是引用類型。 像gMetalModel
和data
這樣的變量存儲指向對象的引用。 在這種情況下,Detail VC中的變量指向與List VC中的變量相同的對象。 這就是為什么通過一個變量更改對象會導致更改在您通過另一個變量訪問對象時反映出來的原因。
為了解決這個問題,可以使類型gMetaModel
值類型,即改變class
,以struct
。 每次將對象分配給另一個變量時,這都會使對象復制自身。
另外,您可以自己編寫一個createCopy
方法。 請記住,還要為gMetaModel
類型引用的引用類型編寫createCopy
方法,以進行深層復制。
第三種選擇是使gMetaModel
的類型不可變。 使所有變異方法創建一個新副本。 但是,這在每種情況下可能都無法正常運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.