web-dev-qa-db-ja.com

fileprivate拡張子とprivate拡張子の違いは?

Swift 3.

fileprivateアクセスレベル修飾子は、関数/プロパティの使用を宣言されたソースファイルに制限し、private-は宣言された字句スコープに制限されていることを知っています。しかし、このルールは拡張機能には適用されないようです。例えば。このコードは有効です:

class Foo {
}

fileprivate extension Foo {
    var aa: Int {
        return aaa + 10
    }
}

private extension Foo {
    var aaa: Int {
        return 20
    }
}

誰かが私がそれらの違いを理解するのを手伝ってくれる?ありがとう。

Swift 4.

privateは拡張子でアクセス可能になりましたが、同じファイル内にあります。他のファイルで拡張子を宣言/定義すると、拡張子からプライベート変数にアクセスできなくなります。

fileprivateは同じファイル内でアクセスできます。

9
Bohdan Savych

違いは、タイプメンバーについて話しているときにのみ発生します。 privateは、同じ型定義内の他のメソッドへのアクセスを制限しますが、fileprivateのものは、同じ.Swiftファイルにあるものからアクセスできます。

トップレベル(型定義の外)にあるものの場合、privatefileprivateはまったく同じことをします。だからあなたが書くとき

fileprivate extension Foo 
{
    var aa: Int 
    {
        return aaa + 10
    }
}

private extension Foo 
{
    var aaa: Int 
    {
        return 20
    }
}

あなたは本当に書いた

fileprivate extension Foo 
{
    var aa: Int 
    {
        return aaa + 10
    }
}

fileprivate extension Foo 
{
    var aaa: Int 
    {
        return 20
    }
}

最終的に、同じプロトコル上の2つの拡張機能は、コンパイラーによって1つの拡張機能に解決されます。

fileprivate extension Foo 
{
    var aa: Int 
    {
        return aaa + 10
    }
    var aaa: Int 
    {
        return 20
    }
}

このような2つのキーワードがあると思うなら 愚かな 、いくつかのSwift建築家 あなたに同意する 。いくつかのスタイルガイドはあなただけを推薦すると思いますpublicおよびprivateアクセス修飾子(およびinternal修飾子ですが、デフォルトではこれがデフォルトです)を使用する必要があります。これは、一般に、ファイルごとに制限するためです。モジュールごとまたはタイプごとのベースとは対照的に、ベースは特に有用ではありません。

fileprivate修飾子を使用する必要がある場合は、型スコープの外でprivate修飾子を使用しないでください。これは混乱を招き(そのコンテキストでのprivateは「本当に」はfileprivateを意味するため)、コードが読みにくくなります。

9
taylor swift

Swift 4.0では、privatefileprivateのスコープが拡張されます。
プライベートは、実際のクラス/拡張子の外で、同じファイル内でアクセスできるようになりました。他のファイルで拡張子を宣言/定義すると、その時点でプライベート変数にアクセスできなくなり、fileprivateが機能します


ファイルプライベート
ファイルプライベートアクセスは、エンティティの使用を独自の定義ソースファイルに制限します。ファイル-プライベートアクセスを使用して、特定の機能の実装の詳細がファイル全体で使用されている場合、それらの詳細を非表示にします。
構文:fileprivate <var type> <variable name>
例:fileprivate class SomeFilePrivateClass {}


プライベート
プライベートアクセスは、エンティティの使用を囲んでいる宣言とその拡張子に制限します同じファイル内にある宣言。プライベートアクセスを使用して、特定の機能の実装の詳細が単一の宣言内でのみ使用されている場合、それらの詳細を非表示にします。
構文:private <var type> <variable name>
例:private class SomePrivateClass {}


すべてのアクセスレベルの詳細は次のとおりです。 Swift-アクセスレベル

3
Krunal