1. ホーム
  2. swift

[解決済み] Swift3でfileprivateとprivateを区別する良い例は何ですか?

2022-05-10 20:09:45

質問

これは 記事 の新しいアクセス指定子を理解する上で役に立ちました。 Swift 3 . のさまざまな使い方の例も示しています。 fileprivateprivate .

私の疑問は fileprivate を使うことは、このファイルの中だけで使われる関数に対して private ?

どのように解決するのですか?

fileprivate は今何ですか private であったものが は以前のSwiftのリリースで使われていたものです。 同じソースファイルからアクセスできます。としてマークされた宣言は private としてマークされた宣言は、それが宣言されているレキシカルスコープ内でのみアクセスできるようになりました。 そのため private よりも制限されます。 fileprivate .

現在 Swift 4, 型の中の private 宣言は、拡張子が同じソースファイルで定義されている場合、同じ型の拡張子にアクセス可能です。

例(すべて1つのソースファイル内)。

class A {
    private func foo() {}
    fileprivate func bar() {}

    func baz() {
        foo()
        bar()
    }
}

extension A {
    func test() {
        foo() // Swift 3: error: use of unresolved identifier 'foo'
              // Swift 4: no error because extension is in same source file
        bar()
    }
}

let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()

  • プライベート foo メソッドのスコープ内でのみアクセス可能です。 その class A { ... } の定義の範囲内でのみアクセス可能です。それは、型の拡張からアクセスすることさえできません。 型への拡張機能からアクセスすることさえできません (Swift 3 では、Swift 4 での変更点については以下の 2 番目のメモを参照してください)。 の変更点を参照してください)。

  • ファイルプライベートの bar メソッドは、同じソースファイルからアクセスできます。

ノート

  1. 提案内容 SE-0159 - プライベートアクセスレベルの修正 は、Swift 4 で Swift 2 のセマンティクスに戻すことを提案しました。swift-evolution メーリングリストでの長くて論争的な議論の後、この提案は に却下されました。 .

  2. 提案の内容 SE-0169 - プライベート宣言と拡張機能の相互作用の改善 private の宣言は、同じ型の拡張機能からアクセスできるようにすることを提案します。 で定義されている場合、その拡張子は で定義されている場合、同じ型の拡張子にアクセスできます。 この提案は受け入れられ、Swift 4で実装されました。