簡體   English   中英

Swift 中的普通數組 vs 'NSMutableArray'?

[英]Normal array in Swift vs 'NSMutableArray'?

那么在 Swift 中,有什么區別

var arr = ["Foo", "Bar"] // normal array in Swift

var arr = NSMutableArray.array() // 'NSMutableArray' object

["Foo", "Bar"].map {
    arr.addObject($0)
}

除了是同一事物的不同實現。 兩者似乎都具有人們可能需要的所有基本功能( .count ,插入/刪除對象的能力等)。

NSMutableArray是在 Obj-C 時代發明的,顯然是為了提供更現代的解決方案,而不是常規的 C 樣式數組。 但是它與 Swift 的內置數組相比如何呢?

哪個更安全和/或更快?

在我看來,最重要的區別是 NSMutableArray 是一種類類型,而 Array 是一種值類型。 因此,NSMutableArray 將作為引用傳遞,而 Swift Array 將通過值傳遞。

此外 NSMutableArray 是 NSObject 的子類,而 Array 沒有父類。 - 這意味着您在使用 NSMutableArray 時可以訪問所有 NSObject 方法和其他“好東西”。

修改時不會復制 NSMutableArray,而會復制 Swift Array。

哪一個最好取決於您的應用程序。

我發現(當使用 UIKit 和 Cocoa touch 時)當我需要一個持久模型時 NSMutableArray 非常棒,而 Array 非常適合性能並丟棄數組。

這些只是我的初步想法,我相信社區中的某個人可以提供更深入的見解。

引用類型何時:(NSMutableArray)

NSObject 的子類必須是類類型 將實例標識與 === 進行比較是有意義的 您想要創建共享的、可變的狀態

值類型何時:(Swift 數組)

將實例數據與 == 進行比較是有意義的(Equatable 協議)您希望副本具有獨立的狀態
數據將在跨多個線程的代碼中使用(避免顯式同步)

有趣的是,Swift 標准庫非常偏愛值類型:原始類型(Int、Double、String 等)是值類型標准集合(Array、Dictionary、Set 等)是值類型

除了上面說明的內容之外,選擇實際上取決於您要實現的內容。 根據經驗,如果沒有強制您選擇引用類型的特定約束,或者您不確定哪個選項最適合您的特定用例,您可以從使用值類型實現數據結構開始。 如果需要,您應該能夠稍后以相對較少的努力將其轉換為引用類型。

結論:

引用類型會產生更多的內存開銷,來自引用計數以及將其數據存儲在堆上。

值得知道的是,在 Swift復制值類型相對便宜

但重要的是要記住,如果您的值類型變得太大,復制的性能成本可能會大於使用引用類型的成本。

暫無
暫無

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

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