web-dev-qa-db-fra.com

Quelle est la différence entre private et fileprivate dans Swift 4?

Dans Swift 4, puisque private est visible dans les extensions également dans le même fichier de code source, en quoi est-il différent du modificateur d'accès fileprivate?

Background: Dans Swift 3, les variables privées d'une classe ne sont pas visibles dans ses extensions situées dans le même fichier. Pour cela, fileprivate devait être utilisé.

10
crypt

Fichier privé
L'accès privé au fichier limite l'utilisation d'une entité à son propre fichier source de définition. Utilisez l'accès privé au fichier pour masquer les détails d'implémentation d'une fonctionnalité spécifique lorsque ces détails sont utilisés dans un fichier entier .
(Syntaxe:} _ fileprivate <var type> <variable name>
Exemple:fileprivate class SomeFilePrivateClass {}


Privé
L'accès privé restreint l'utilisation d'une entité à la déclaration englobante et aux extensions de cette déclaration qui se trouvent dans le même fichier. Utilisez un accès privé pour masquer les détails d'implémentation d'une fonctionnalité spécifique lorsque ces détails ne sont utilisés que dans une seule déclaration .
(Syntaxe:} _ private <var type> <variable name>
Exemple:private class SomePrivateClass {}


Voici plus de détails sur tous les niveaux d'accès: Swift - Niveaux d'accès

Réponse à votre question:(Dans Swift 3, les variables privées d'une classe ne sont pas visibles dans ses extensions situées dans le même fichier. Pour cela, il fallait utiliser le fichier privé.)} _

Oui, dans Swift 4.0, Private est maintenant accessible en extension, mais dans le même fichier. Si vous déclarez/définissez une extension dans un autre fichier, votre variable privée ne sera pas accessible pour votre extension


Regardez ces images:
Fichier: ViewController.Swift
Ici, l'extension et le contrôleur de vue sont dans le même fichier, la variable privée testPrivateAccessLevel est donc accessible en extension

enter image description here


Fichier: TestFile.Swift
Ici, l'extension et le contrôleur de vue se trouvent dans des fichiers différents. La variable privée testPrivateAccessLevel n'est donc pas accessible en extension.

enter image description here

enter image description here


Ici, la classe ViewController2 est une sous-classe de ViewController et les deux sont dans le même fichier. Ici, la variable privée testPrivateAccessLevel n'est pas accessible dans la sous-classe mais le fichier privé est accessible dans la sous-classe.

enter image description here

28
Krunal

Applicable dans Swift 4.0 et ses versions
Private
Accès privé uniquement en classe et son extension (lorsque l'extension est dans le même fichier .Swift).

Fichier privé
Accès fichier-privé uniquement dans la classe et son extension & subClass (lorsque l'extension ou la sous-classe est dans le même fichier .Swift).

5
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
            }
        }
0
jeevan eashwar