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?
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.
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 MyPrivateVar
priv
à 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'