2014-06-08 85 views
6

我讀過整個Swift book,並觀看了所有WWDC videos(我衷心推薦的所有內容)。我擔心的一件事是數據封裝。Swift中的數據封裝

考慮以下(完全做作)例如:

class Stack<T> 
{ 
    var items : T[] = [] 

    func push(newItem: T) { 
     items.insert(newItem, atIndex: 0) 
    } 

    func pop() -> T? { 
     if items.count == 0 { 
      return nil; 
     } 

     return items.removeAtIndex(0); 
    } 
} 

此類實現一個棧,以及使用數組實現它。問題是,items(就像Swift中的所有屬性)是公共的,所以沒有任何東西可以阻止任何人直接訪問(甚至是變異)它與公共API分離。作爲一個古怪的C++老手,這讓我非常暴躁。

我看到有人抱怨缺乏訪問修飾符,雖然我同意他們會直接解決這個問題(並且我聽到有傳言說他們可能會實現Soon™),但我想知道數據隱藏的一些策略是什麼在他們的缺席。

我錯過了什麼,或者這只是在語言中的遺漏?

+0

可能的重複:http://stackoverflow.com/q/24003918/1639670 – nathan

+0

有一種實際的一半做某種數據隱藏 - 協議。只要讓你的課程符合你的協議,就可以使用所有功能和你想要被外部世界看到的東西,並且通過它而不是課程本身。正如我所說這不是替代品,但將工作,直到可見性修飾符出局。此外,這是一個很好的設計模式 - 依賴注入 –

+0

「所以沒有任何東西可以阻止任何人直接訪問(甚至突變)它與公共API分開」 - 除了是一個「蹩腳的老C++人」:-)你有什麼傷害如果你不強行阻止人們按照他們想要的方式使用你的代碼,會不會認爲會發生?例如,Python有一句話:「我們都是成年人。」公/私是基於文件和慣例。如果有人想搗鼓班級內部的某些東西,請注意空手道。沒有人假裝他們可以永遠知道,沒有人會有一個很好的理由來訪問一個內部對象。 – alcalde

回答

6

它現在只是缺少。格雷格帕克明確表示(in this dev forums thread),可見性修改器即將到來。

鑑於沒有標題,標準的Objective-C技巧將無法正常工作,我想不出另一個限制可見性的技巧,它不涉及大量向後彎曲。由於語言功能已被承諾,我不確定這是值得任何大的投資。

由於這個特點在光通量方面的好處,現在是file a radar的好時機,並影響它的結果。

0

事實上,我很高興Swift最終採用了靜態類型,所以符合最優OO屬性的代碼理論,但頭文件的下降打破了面向對象編程(即封裝)的良性。對於埃菲爾來說,一種解決方法就是自動提取標題,但不指定哪些是公共接口以及哪些是私有接口,這將是一件好事。我對Apple的這一舉動非常吝惜。

4

更新的答案供將來參考。

從蘋果公司的documentation

訪問級別

斯威夫特爲您的代碼中 實體三種不同的訪問級別。這些訪問級別與定義實體的源文件相關,也相對於源文件所屬的 模塊。

公共接入使實體 從一個導入定義模塊另一個模塊從他們的定義模塊的所有源文件中使用,也 源文件。 通常在將公共接口 指定給框架時使用公共接口。

內部訪問使得能夠從他們的定義模塊任何 源文件中所使用的實體,但不以任何源文件 該模塊的外部。當您定義應用程序或框架的內部結構時,您通常使用內部訪問。

私人訪問 限制使用實體到自己定義的源文件。使用 私有訪問來隱藏特定片段的實現細節 的功能。公共訪問是訪問級別最高(限制最少) ,私有訪問是訪問級別最低(或限制最多) 。