簡體   English   中英

關於Swift中復制的問題

[英]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可能是引用類型。 gMetalModeldata這樣的變量存儲指向對象的引用。 在這種情況下,Detail VC中的變量指向與List VC中的變量相同的對象。 這就是為什么通過一個變量更改對象會導致更改在您通過另一個變量訪問對象時反映出來的原因。

為了解決這個問題,可以使類型gMetaModel值類型,即改變class ,以struct 每次將對象分配給另一個變量時,這都會使對象復制自身。

另外,您可以自己編寫一個createCopy方法。 請記住,還要為gMetaModel類型引用的引用類型編寫createCopy方法,以進行深層復制。

第三種選擇是使gMetaModel的類型不可變。 使所有變異方法創建一個新副本。 但是,這在每種情況下可能都無法正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM