Swift 4では、private
が同じソースコードファイルでも拡張機能に表示されるようになったため、fileprivate
アクセス修飾子とどう違うのですか?
Background: Swift 3の場合、クラス内のプライベート変数は、同じファイルの拡張機能では表示されません。そのため、fileprivate
は中古。
File Private
ファイルプライベートアクセスは、エンティティの使用をそれ自体の定義ソースファイルに制限します。ファイルプライベートアクセスを使用して、特定の機能の実装の詳細がファイル全体で使用されている場合に、それらの詳細を非表示にします。
構文:fileprivate <var type> <variable name>
例:fileprivate class SomeFilePrivateClass {}
プライベート
プライベートアクセスは、エンティティの使用を、囲んでいる宣言、および同じファイル内のその宣言の拡張に制限します。特定の機能の実装の詳細が単一の宣言内でのみ使用される場合は、プライベートアクセスを使用して、特定の機能の実装の詳細を非表示にします。
構文:private <var type> <variable name>
例:private class SomePrivateClass {}
すべてのアクセスレベルの詳細は次のとおりです。 Swift-アクセスレベル
質問への回答:(Swift 3の場合、クラスのプライベート変数は同じファイルの拡張子では表示されません。そのためには、fileprivateを使用する必要がありました。)
はい、Swift 4.0では、Privateは拡張機能で同じファイル内でアクセスできるようになりました。他のファイルで拡張機能を宣言/定義すると、プライベート変数が拡張機能にアクセスできない
この画像を見てください:
ファイル:ViewController.Swift
ここでは、拡張機能とビューコントローラの両方が同じファイルにあるため、拡張機能でプライベート変数testPrivateAccessLevel
にアクセスできます
ファイル:TestFile.Swift
ここでは、拡張機能とビューコントローラの両方が異なるファイルにあるため、拡張機能ではプライベート変数testPrivateAccessLevel
にアクセスできません。
ここにクラスViewController2
はViewController
のサブクラスであり、両方とも同じファイルにあります。ここで、プライベート変数testPrivateAccessLevel
はサブクラスでアクセスできませんが、fileprivateはサブクラスでアクセスできます。
Swift 4.0およびそのバージョンで適用可能
Private
クラスとその拡張子のみのプライベートアクセス(拡張子が同じ.Swiftファイルにある場合)。
File Private
クラスとその拡張子およびsubClassでのみファイルプライベートアクセス(拡張子またはsubClassが同じ.Swiftファイルにある場合)。
///////////////ViewController1.Swift file
class ViewController1 {
private func testPrivate() {
print("testPrivate")
}
fileprivate func testFilePrivate() {
print("testFilePrivate")
}
func doesNothing1() {
testPrivate() //success
testFilePrivate() //success
}
}
extension ViewController1 {
func doesNothingInExtensionSameFile() {
testPrivate() //success
testFilePrivate() //success
}
}
class SomeOtherClassInSameFile {
let vc1 = ViewController1()
func doesNothing() {
vc1.testPrivate() //throws error
vc1.testFilePrivate() //success
}
}
////////////// ViewController2.Swift file
extension ViewController1 {
func doesNothingInExtensionDifferentFile() {
testPrivate() //throws error
testFilePrivate() //throws error
}
}
privateおよびfileprivate Swift4では、アクセスレベルがより近くなりました。
アクセスの違いは次のとおりです。
fileprivateメンバー-その.Swiftファイル内にのみ&完全に
privateメンバー-両方が同じ.Swiftファイルに存在する場合、そのクラスとクラスの拡張子のみ
したがって、fileprivateメンバー(privateではない)のみにアクセスできます