2017-10-05 58 views
3

在Swift 4中,從現在開始private在同樣源代碼文件中的擴展中也是可見的,它與fileprivate訪問修飾符有什麼不同?Swift 4中private和fileprivate之間的區別

背景:在Swift 3中,類中的私有變量在同一個文件的擴展中是不可見的。爲此,必須使用fileprivate

回答

8

私有文件
文件私有訪問限制實體對其自己定義的源文件的使用。當在整個文件中使用這些詳細信息時,使用文件私有訪問來隱藏特定功能塊的實現細節。
語法:fileprivate <var type> <variable name>
實施例:fileprivate class SomeFilePrivateClass {}


私人
私人接入限制使用的實體到封閉聲明的,並且是在相同的該聲明的擴展文件。當這些細節僅在單個聲明中使用時,使用私有訪問來隱藏特定功能的實現細節。
語法:private <var type> <variable name>
例子:private class SomePrivateClass {}


這是所有訪問級別的更多細節:Swift - Access Levels

回答你的問題: (在斯威夫特3,私有變量一個類在同一個文件的擴展名中是不可見的,因此必須使用fileprivate。)

是的,在Swift 4.0中,Private現在可以擴展訪問,但在同一個文件中。在其他文件如果你聲明/定義擴展,那麼你的私有變量不會對您的擴展訪問


看看這個圖片:
文件: ViewController.swift
這裏延伸和視圖控制器都在同一個文件中,因此私有變量testPrivateAccessLevel可擴展訪問

enter image description here


文件: TestFile.swift
這裏延伸和視圖控制器都是在不同的文件,因此私有變量testPrivateAccessLevel是不是在擴展訪問。

enter image description here

enter image description here


下面類ViewController2ViewController一個子類,都是在同一個文件中。這裏私有變量testPrivateAccessLevel不能在Subclass中訪問,但fileprivate可以在子類中訪問。

enter image description here

+0

它看起來像私人和文件私人可以互換地使用現在。你能提供一個例子,其中私人可以使用,但不privateprivate,反之亦然。 – crypt

+0

感謝您的示例。我明白你的觀點。但我擔心的是,如果在上面的例子中,我將關鍵字private和fileprivate交換,輸出不會改變。 – crypt

+1

不,如果您將您的擴展名移到另一個文件中,則fileprivate也將無法訪問。 – crypt

相關問題