web-dev-qa-db-fra.com

Accès aux variables fileprivate et private dans l'extension et une autre classe en utilisant Swift 4

J'ai parcouru les récents documents Swift et travaillé sur quelques exemples pour comprendre les mots-clés private et fileprivate dans Swift4. J'essaie d'accéder à une variable fileprivate et private dans une extension de la même classe et une autre classe sous-classant la classe mais la sortie est infructueuse. J'utilise de la manière suivante

  class privateUsageExample: UIViewController {
    private var priVar = false
    fileprivate var fPriVar = false
  }

  // usage of extension in the same class

  extension privateUsageExample: UITextFieldDelegate {

     if priVar{ // do something} // error : expected declaration
     if fPriVar{ // do something} // error : expected declaration

     func randFunc(){ 
        self. fPriVar = true // accessible don't know the reason 
      }
  }

  // access of private and fileprivate variables in another class different file

  class anotherUsageInDiffSwiftFile: privateUsageExample {

   priVar = false // inaccessible (how to access it)
   fPriVar = true // inaccessible (how to access it)

 }

pouvez-vous s'il vous plaît m'aider à accéder à la variable priVar (privé) et fPriVar (fileprivate) dans l'extension de la même classe dans le même fichier et dans une autre classe sous-classant la classe dans le fichier différent.

9
arun_K

Dans Swift 4.0, Private est désormais accessible dans l'extension mais dans le même fichier. Si vous déclarez/définissez l'extension dans un autre fichier, votre variable privée ne sera pas accessible à votre extension **

Fichier privé
L'accès privé au fichier limite l'utilisation d'une entité à son propre fichier source de définition. Utilisez un 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é limite 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

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

enter image description here


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

enter image description here

enter image description here


Voici 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 fileprivate est accessible dans la sous-classe.

enter image description here

17
Krunal
  1. Vous ne pouvez pas écrire immédiatement si des stubs à l'intérieur d'une extension. Il est destiné à être écrit à l'intérieur d'une fonction. Donc, ce n'est pas un problème avec private/fileprivate mais plutôt votre compréhension des extensions. Considérez les extensions comme faisant partie de la déclaration de classe. Dans une classe aussi, vous ne pouvez écrire que si des talons se trouvent dans une fonction ou une fermeture.

  2. La variable fileprivate à l'intérieur d'une extension, était accessible même dans Swift 3. Donc je ne comprends pas, votre commentaire //accessible don't know the reason. Cependant, dans Swift 4, private a changé sa signification en ce sens que si l'extension est définie dans le même fichier que class, alors les variables privées sont également accessibles à l'intérieur des extensions. Ce n'était pas vrai dans Swift3.

extension privateUsageExample: UITextFieldDelegate {
    func randFunc(){
        self.fPriVar = true 
        self.priVar = false
    }
}
  1. Si une variable est définie comme privée/privée de fichier, je crains que vous ne puissiez pas y accéder dans une extension dans un autre fichier.
3
Puneet Sharma