Swift3でfileprivateとprivateを区別する良い例は何ですか?質問する

Swift3でfileprivateとprivateを区別する良い例は何ですか?質問する

これ記事は、 の新しいアクセス指定子を理解するのに役立ちました。また、とSwift 3のさまざまな使用例もいくつか示しています。fileprivateprivate

fileprivate私の質問は、このファイルでのみ使用される関数で を使用することは、 を使用することと同じではないのですprivateか?

ベストアンサー1

fileprivateは、以前の Swift リリースと同じようになりましたprivate。つまり、同じソース ファイルからアクセスできるようになりました。 としてマークされた宣言は、private宣言されている構文スコープ内でのみアクセスできるようになりました。したがって、 はprivateよりも制限が厳しくなりますfileprivate

現在スイフト4、拡張機能が同じソース ファイルで定義されている場合、型内のプライベート宣言は同じ型の拡張機能からアクセスできます。

例 (すべて 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 に実装されました。

おすすめ記事