簡體   English   中英

在Objective-C中使用不可變集合時,如何執行Clojure之類的操作?

[英]How can I do things like Clojure when using immutable collections in Objective-C?

我已經有點沉迷於使用不可變集合(主要是在Clojure中,它稱之為“持久數據結構”),並且希望能夠在iOS和OS X的某些上下文中以這種方式編程。

這將是有用的一個關鍵示例是能夠通過創建修改后的副本來“更改”字典,並且讓更改偵聽器能夠查詢舊值和新值之間的差異,而不是嘗試將更改編碼為財產變更事件。 不可變數據結構也是並發編程的游戲改變者:不需要鎖。

是的,您現在可以使用不可變的NSArrayNSDictionary實例來執行此操作,但是當您擁有越來越大的集合和/或經常進行更改時,將它們復制到“更改”版本變得越來越低效:對大數據進行小的更改然后,結構涉及不成比例的工作量。

我正在尋找一種在Objective-C中啟用不可變數據編程的方法。 為了澄清這可能是什么樣子,以及它提供的更多優勢,Phil Bagwell在這個SO問題中引用的研究具有高度相關性。

請參閱Ridiculous Fish上的這篇文章(我相信,由AppKit團隊的工程師Cory Doras編寫,也是Fish shell的創建者):

數組:我們的陣列不是 http://ridiculousfish.com/blog/posts/array.html

你已經回答了你的問題:

是的,您現在可以使用不可變的NSArray和NSDictionary實例來執行此操作...

Cocoa框架的優點在於它的簡單性,特別是在數據結構方面。 我們的想法是,幕后代碼應該確定如何實現結構,而不是你。 在實踐中,您只需要兩種“類型”的數據結構:數組和字典(或地圖,如果您來自其他語言)。 當然,您需要許多“類型”的實現,但您只需要兩種方式來訪問您的數據; 如果你需要更多的方法,那么自定義類和組合就會發揮作用。

至於你對效率的關注:不要擔心。 Cory(Ridiculous Fish)的文章顯示,在引擎蓋下,Apple已經滿足了您的效率條款。 畢竟只是指針,正如Ian Murray在評論中指出的那樣:所有內容都是引用計數,只有在必要時才會被復制。 當您“復制”或“mutableCopy”NSArray或NSDictionary時,最有可能的是,實際上並未復制基礎數據。 要了解如何實現這一點,請參閱Rob Pike關於Go語言的文章: http//blog.golang.org/slices 我幾乎可以肯定Cocoa遵循類似的模式,甚至可能更進一步。

此外,與目標C的出現“塊”,它現在是在一個功能的風格點菜 LISP變體(如Clojure的)越來越多的可行方案。 事實上,我強烈推薦這一點,並鼓勵你繼續這條道路。 如果做得好,它可以導致更穩定,更清晰的代碼。

我認為這里沒有捷徑。

就像你暗示的那樣,Clojure的持久數據結構與Cocoa提供的不可變集合類完全不同。

如果你想使用來自Obj-C的Clojure的持久數據結構,唯一的方法就是在Objective-C中重新實現它們。 我的理解是,許多這些都在Okasaki的書“ Purely Functional Data Structures ”和Phil Bagwell的論文中有所描述。

這個答案有一些聯系: Clojure集合背后的數據結構是什么?

暫無
暫無

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

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