web-dev-qa-db-ja.com

Swift 4のプライベートとファイルプライベートの違いは何ですか

Swift 4では、privateが同じソースコードファイルでも拡張機能に表示されるようになったため、fileprivateアクセス修飾子とどう違うのですか?

Background: Swift 3の場合、クラス内のプライベート変数は、同じファイルの拡張機能では表示されません。そのため、fileprivateは中古。

10
crypt

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にアクセスできます

enter image description here


ファイル:TestFile.Swift
ここでは、拡張機能とビューコントローラの両方が異なるファイルにあるため、拡張機能ではプライベート変数testPrivateAccessLevelにアクセスできません。

enter image description here

enter image description here


ここにクラスViewController2ViewControllerのサブクラスであり、両方とも同じファイルにあります。ここで、プライベート変数testPrivateAccessLevelはサブクラスでアクセスできませんが、fileprivateはサブクラスでアクセスできます。

enter image description here

34
Krunal

Swift 4.0およびそのバージョンで適用可能
Private
クラスとその拡張子のみのプライベートアクセス(拡張子が同じ.Swiftファイルにある場合)。

File Private
クラスとその拡張子およびsubClassでのみファイルプライベートアクセス(拡張子またはsubClassが同じ.Swiftファイルにある場合)。

7
Vaibhav Sharma
///////////////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
            }
        }
1
jeevan eashwar

privateおよびfileprivate Swift4では、アクセスレベルがより近くなりました。

アクセスの違いは次のとおりです。

fileprivateメンバー-その.Swiftファイル内にのみ&完全に

privateメンバー-両方が同じ.Swiftファイルに存在する場合、そのクラスとクラスの拡張子のみ

したがって、fileprivateメンバー(privateではない)のみにアクセスできます

  • 同じ.Swiftファイル内のサブクラス
  • 同じ.Swiftファイル内の(別のクラスで初期化された)クラスのインスタンス。
0
vesirak