web-dev-qa-db-fra.com

La var privée est accessible de l'extérieur de la classe

Cela a été fait dans Playground, juste pour simplifier.

class MyPrivateVar
{
    private var priv: String?
}

var myInstance = MyPrivateVar()

myInstance.priv = "Something"

Aucun avertissement du compilateur. En fait, la saisie semi-automatique affiche priv sans problème. Ma compréhension est qu'en dehors des limites de {} de la classe, je ne suis pas censé pouvoir voir quoi que ce soit privé, func ni var.

Suis-je en train de manquer quelque chose?

32
bauerMusic

Les modificateurs d'accès dans Swift sont implémentés différemment des autres langues. Il existe trois niveaux:

private: accessible uniquement dans ce fichier particulier

internal: accessible uniquement dans le module (projet)

public: accessible de partout

Sauf indication contraire, tout ce que vous écrivez est internal par défaut.

Le le blog de Swift avait un article sur le contrôle d'accès lorsque les fonctionnalités ont été introduites en version bêta 4, et la documentation d'Apple contient un chapitre également.

45
Nate Cook

Remarque: cette réponse est pour Swift 2


Le langage de programmation Swift ) indique:

Swift propose trois niveaux d'accès différents pour les entités de votre code. Ces niveaux d'accès sont relatifs au fichier source dans lequel une entité est définie, et également au module auquel appartient le fichier source.

Si vous ne voulez pas tester le niveau d'accès private avec Swift, l'étape suivante peut vous aider.

1/Créez un nouveau projet Xcode.

2/Créez un fichier, MyPrivateVar.Swift, et ajoutez-y le code suivant:

class MyPrivateVar {

    private var priv: String? = nil

}

3/Créez un deuxième fichier, MySecondClass.Swift, et ajoutez-y le code suivant:

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

Xcode vous donnera immédiatement un Swift:

'MyPrivateVar' n'a pas de membre nommé 'priv'

4/Maintenant, supprimez les deux fichiers précédents de votre projet et créez un seul fichier TwoClassesInAFile.Swift avec le code suivant:

class MyPrivateVar {

    private var priv : String? = nil

}

class MySecondClass {

    init() {
        var myPrivateVar = MyPrivateVar()
        myPrivateVar.priv = "some string"
    }

}

Cette fois, vous n'obtiendrez aucun message d'erreur du compilateur Swift et vous pourrez accéder à la propriété privée de MyPrivateVarpriv à partir de MySecondClass car priv et MySecondClass sont dans le même fichier (votre fichier TwoClassesInAFile.Swift).

De plus, les niveaux d'accès fonctionnent également pour les variables globales. Par exemple, Xcode ne donnera aucune erreur de compilation si le code suivant fait partie du même fichier ViewController.Swift:

import UIKit

private var globalPrivate : String? = nil

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        globalPrivate = "some string"
        println(globalPrivate)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Cependant, si vous définissez globalPrivate en dehors de ViewController.Swift, Xcode générera un message d'erreur:

Utilisation de l'identifiant non résolu 'globalPrivate'

8
Imanou Petit