fileprivate
est maintenant ce que private
était dans les versions précédentes versions précédentes de Swift : accessibles à partir le même fichier source. Une déclaration marquée comme private
ne peut maintenant être accédé qu'à l'intérieur de la portée lexicale dans laquelle il est déclaré. Ainsi, private
est plus restrictive que fileprivate
.
A partir de Swift 4, Les déclarations privées à l'intérieur d'un type sont accessibles aux extensions du même type si l'extension est définie dans le même fichier source.
Exemple (tout dans un seul fichier source) :
class A {
private func foo() {}
fileprivate func bar() {}
func baz() {
foo()
bar()
}
}
extension A {
func test() {
foo() // Swift 3: error: use of unresolved identifier 'foo'
// Swift 4: no error because extension is in same source file
bar()
}
}
let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()
-
Le privé foo
n'est accessible que dans le cadre de l'adresse class A { ... }
définition. Elle n'est même pas accessible depuis une extension du type (dans Swift 3, voir la deuxième note ci-dessous pour les pour les changements dans Swift 4).
-
Le fichier-privé bar
est accessible à partir du même fichier source.
Notes :
-
La proposition SE-0159 - Correction des niveaux d'accès privés suggéré de revenir à la sémantique de Swift 2 dans Swift 4. Après une discussion longue et controversée sur la liste de diffusion swift-evolution, la proposition a été acceptée. rejeté .
-
La proposition SE-0169 - Améliorer l'interaction entre les déclarations privées et les extensions suggère de faire private
les déclarations à l'intérieur d'un type accessibles aux extensions du même type si l'extension est définie dans le même fichier source. Cette proposition a été acceptée et mise en œuvre dans Swift 4.