2017-04-19 24 views
2

特別是關於成員變量,Swift 3中的以下內容有區別嗎?在這兩種情況下,Foo都可以通過該文件中的所有代碼訪問。與隱式範圍的'laa'屬性一樣,這似乎與文檔相矛盾。在Swift 3中,關於成員變量,'private class Foo'和'fileprivate class Foo'有區別嗎?

如果您將某個類型的訪問級別定義爲私有或私有文件,則其成員的默認訪問級別也將爲私有或私有文件。

但是,在下面的兩種情況下,'laa'可以從同一文件中的其他類訪問,這意味着它是fileprivate,而不是私人的,因爲文檔說第一個應該是。

private class Foo 
{ 
    var laa:String 
} 

fileprivate class Foo 
{ 
    var laa:String 
} 
+0

相關:[區分私人和fileprivate頂級類](http://stackoverflow.com/questions/43054774/distinction-between-private-and-fileprivate-top-level-classes) – Hamish

+0

感謝您刪除dup! :) – MarqueIV

+0

我只是簡單地說在這種情況下文檔是錯誤的,或者至少是誤導 - private類型的成員可以訪問的範圍默認情況下是定義該類型的封閉範圍。在頂層聲明的情況下 - 文件就是這個範圍。 – Hamish

回答

2

正如this Q&A說 - 有一個在頂層privatefileprivate聲明的訪問級別沒有差別。 private僅僅意味着它僅在封閉範圍中可訪問,並且在頂層 - 文件那個範圍。

關於the documentation comment

如果你定義一個類型的訪問級別爲私人或私人文件,其成員的默認訪問級別也將是私人或私人文件。

我會說這是不正確的,或者至少在private的情況下誤導。默認情況下,給定類型的成員可見的範圍是類型聲明本身可見的範圍(除訪問級別高於internal)。

因此,private類型的成員可以訪問的範圍默認爲定義該類型的封閉範圍。在頂層,這是文件。

只是說類型成員默認爲internal可能更簡單。被聲明爲訪問級別低於此級別的類型(例如privatefileprivate)只能防止這些成員在這些訪問級別之外可見(因爲無法查看給定類型的成員是無意義的鍵入自己)。


1。注意,在夫特4,按照SE-0169,被相同的源文件作爲類型中聲明的給定類型的擴展具有相同訪問控制範圍作爲類型的範圍宣言。因此他們可以訪問private類型的成員。

相關問題