it-swarm.com.de

Was ist der Unterschied zwischen privat und fileprivate in Swift 4?

In Swift 4 ist private jetzt in Erweiterungen auch in derselben Quellcodedatei sichtbar. Worin unterscheidet es sich dann von fileprivate access modifier?

Hintergrund: In Swift 3 sind private Variablen in einer Klasse in den Erweiterungen derselben Datei nicht sichtbar. Dafür musste fileprivate verwendet werden.

10
crypt

File Private
Der private Zugriff auf Dateien beschränkt die Verwendung einer Entität auf ihre eigene definierende Quelldatei. Verwenden Sie den privaten Dateizugriff, um die Implementierungsdetails eines bestimmten Funktionselements zu verbergen, wenn diese Details in einer gesamten Datei verwendet werden.
Syntax:fileprivate <var type> <variable name>
Beispiel:fileprivate class SomeFilePrivateClass {}


Privatgelände
Der private Zugriff beschränkt die Verwendung einer Entität auf die einschließende Deklaration und auf Erweiterungen der Deklaration , die sich in derselben Datei befinden. Verwenden Sie den privaten Zugriff, um die Implementierungsdetails eines bestimmten Funktionselements auszublenden, wenn diese Details nur in einer einzelnen Deklaration verwendet werden .
Syntax:private <var type> <variable name>
Beispiel:private class SomePrivateClass {}


Hier finden Sie weitere Informationen zu allen Zugriffsebenen: Swift - Zugriffsebenen

Beantworten Sie Ihre Frage:(In Swift 3 sind private Variablen in einer Klasse in ihren Erweiterungen nicht in derselben Datei sichtbar. Dazu musste fileprivate verwendet werden.)

Ja, in Swift 4.0 kann auf Private jetzt in der Erweiterung, aber in derselben Datei, zugegriffen werden. Wenn Sie die Erweiterung in einer anderen Datei deklarieren/definieren, ist Ihre private Variable für Ihre Erweiterung nicht zugänglich.


Sehen Sie sich diese Bilder an:
File: ViewController.Swift
Die Erweiterung und der View-Controller befinden sich hier in derselben Datei, daher ist die private Variable testPrivateAccessLevel in der Erweiterung verfügbar

enter image description here


File: TestFile.Swift
Die Erweiterung und der Ansichtscontroller befinden sich hier in unterschiedlichen Dateien, daher ist die private Variable testPrivateAccessLevel nicht in der Erweiterung verfügbar.

enter image description here

enter image description here


Hier ist die Klasse ViewController2 eine Unterklasse von ViewController und beide befinden sich in derselben Datei. Auf die private Variable testPrivateAccessLevel kann hier nicht in der Unterklasse zugegriffen werden, auf fileprivate kann jedoch in der Unterklasse zugegriffen werden.

enter image description here

28
Krunal

Anwendbar in Swift 4.0 und seinen Versionen
Privatgelände
Privater Zugriff nur in der Klasse und ihrer Erweiterung (Wenn die Erweiterung sich in derselben .Swift-Datei befindet).

File Private
Privater Dateizugriff nur in der Klasse und ihrer Erweiterung & subClass (Wenn die Erweiterung oder Unterklasse sich in derselben .Swift-Datei befindet).

5
Vaibhav Sharma

privat und Dateiprivat Die Zugriffsebenen sind mit Swift4 näher gerückt.

Der Unterschied beim Zugang ist folgender:

fileprivate Mitglieder - nur & vollständig in dieser .Swift-Datei

private Mitglieder - nur in dieser Klasse & Erweiterung der Klasse, wenn beide in derselben .Swift-Datei vorhanden sind

Daher kann nur auf fileprivate Mitglieder (nicht auf private) zugegriffen werden

  • Unterklassen in derselben .Swift-Datei
  • Instanzen der Klasse (in einer anderen Klasse initialisiert) in derselben .Swift-Datei.
0
vesirak
///////////////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
            }
        }
0
jeevan eashwar