Exposer ou masquer une déclaration
Au niveau d'un module, une déclaration sans modificateur possède la visibilité
module. Tous les fichiers possédés par le même module logique composé peuvent
l'utiliser : ses atomes @Nom.sx, ses modules d'implémentation et ses fragments
portable, Platform et Target sélectionnés.
func helper() {}
public func start() {
helper()
}
func main() {
start()
}
Choisir une portée géographique
publicexpose la déclaration aux consommateurs du package.packagel'expose aux modules du package et aux packages enfants autorisés avecfriend: true.modulel'expose au module logique composé ; c'est la valeur par défaut.localla limite au fichier source exact.
public struct Position { var x:int }
package struct DecodeState {}
local struct ParserState {}
Le modificateur module explicite reste accepté lorsqu'une frontière demande
à être soulignée, mais son omission est le style courant.
Deux packages partageant un préfixe ne partagent pas package sans permission
friend. Une déclaration local ne franchit jamais son fichier. Les atomes
d'un même module partagent module sans fusionner leurs portées lexicales ni
leurs imports ; leur nom physique @Nom n'entre jamais dans un chemin source.
Sans atome, deux chemins frères restent deux frontières distinctes.
private et protected sont relatifs à un type et sont donc refusés au niveau
du module. private appartient à la famille du type déclarant ; protected
est réservé aux membres de classe et à leurs descendants.
Faire hériter les membres de leur type
Un champ, constructeur, méthode, membre statique ou type imbriqué sans modificateur hérite de la visibilité de son type conteneur.
public class Session {
private let token:str
init(token:str) {
self.token = token
}
func text() str {
return self.token
}
package func debug() {}
}
Session.init et Session.text sont publics par héritage. La visibilité du
type plafonne toujours celle de ses membres : un modificateur explicite peut la
conserver ou la réduire, jamais l'agrandir. Écrire public func dans une classe
visible seulement par son module est une erreur, pas une visibilité
silencieusement plafonnée.
Une redéfinition ou une implémentation de protocole conserve la visibilité de son type concret. Un appel à travers un type de base ou un protocole déjà accessible conserve le contrat visible ; l'implémentation n'a pas à le publier à nouveau.
use introduit un nom dans son fichier et public use le réexporte. Les autres
modificateurs de visibilité ne s'appliquent pas à use.