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é.
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
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.
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.
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).
///////////////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
}
}