これ記事は、 の新しいアクセス指定子を理解するのに役立ちました。また、とSwift 3
のさまざまな使用例もいくつか示しています。fileprivate
private
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
メソッドは、同じソース ファイルからアクセスできます。
ノート:
提案SE-0159 – プライベート アクセス レベルの修正Swift 4ではSwift 2のセマンティクスに戻すことを提案しました。Swift-Evolutionメーリングリストでの長く議論の多い議論の後、この提案は拒否された。
提案SE-0169 – プライベート宣言と拡張機能間の相互作用の改善
private
拡張が定義されている場合、型内の宣言を同じ型の拡張からアクセス可能にすることを提案する。同じソースファイル。この提案は受け入れられ、Swift 4 に実装されました。