簡體   English   中英

class 的一個實例更改了屬性值,但其他實例未隨着 swift 中的屬性更改而更新

[英]One instance of a class changing property value but other instance doesn't get updated with the change of property in swift

在這里你可以看到 class SameData 有兩個實例 data1 和 data2。 如果我更改存儲在 class 屬性中的 data2 實例用戶名,它不會在同一 class 的 data1 實例中更新。

在 swift class 中,當一個實例中的屬性更改時,應在所有實例中更新。 但為什么會這樣?

代碼:

class SameData { 
var userName = "Anonymous" 
} 
var data1 = SameData()
var data2 = SameData() 
data2.userName = "Not Anonymous"
print(data2.userName) 
print(data1.userName)

結果:

"Not Anonymous\n"
"Anonymous\n"

由於這是一個 class 並且一個實例正在更改用戶名,那么 class 的所有實例都應該采用更改,對嗎? 所以,結果應該是這樣的。

預期結果:

"Not Anonymous\n"
"Not Anonymous\n"

在 class 屬性中

這些不是 class 屬性。 這些只是兩個不同實例上的實例屬性。 自然,改變一個不會改變另一個。 這就是實例的全部意義。 它們是單獨的實例。 這些只是具有默認值的實例屬性,類似於編寫:

class SameData { 
    var userName: String

    init() {
        self.userName = "Anonymous" 
    }
} 

Class 屬性用class標記(或類似的static ,大致相當於class final

也就是說,將用戶名標記為 class 常量並沒有真正意義。 想必每個用戶都應該有自己的用戶名,而且應該是獨立的。 您應該在 model 中添加更多關於您嘗試的數據類型的詳細信息,以便我們可以就如何處理它提供更具體的建議。

我將解釋為答案,因為我無法將其納入評論。

  • var data1 = SameData()中, SameData()是 object, data1就像指向 object 的手指。
  • 然后當您說var data2 = SameData()時:您創建第二個 object,並將手指data2指向該 object。

所以你有 2 個對象,2 個手指分別指向每個 object,object 都不知道另一個的存在。

現在,如果您執行var data2 = data1 ,則不會創建新的 object,而是將另一個手指data2指向您之前創建的相同object。 所以在這里你有 2 個手指指向同一個 object。

因此,在第一種情況下,通過更改data1 ,您將更改第一個 object,但第二個 object( data2指向的)保持不變。

在第二種情況下,通過更改data1 ,您正在更改您擁有的唯一 object 。 由於兩個手指都指向同一個 object,他們都看到了變化。

暫無
暫無

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

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