web-dev-qa-db-fra.com

Swift 2 interne vs privé

Je suis confus au sujet du modificateur d'accès interne et privé. 

La documentation dit:

«L’accès interne permet aux entités d’être utilisées dans n’importe quel fichier source à partir de leur module de définition, mais pas dans un fichier source en dehors de cela module. Vous utilisez généralement un accès interne lors de la définition d’une application ou d’un fichier structure interne du cadre. "

Comment je pensais que c'était, était qu'avec interne vous pouvez accéder à tout si vous êtes dans votre propre application. Mais ce n'est pas vrai, parce que quand j'ai un viewcontroller ce qui est interne par défaut et que j'ai une fonction interne sur ce viewcontroller, je ne peux pas y accéder depuis un autre fichier d'un autre groupe (vous les créez dans xCode). 

Ce que j'ai essayé, c'est d'avoir un ViewController ayant une méthode foo dans le groupe A puis dans le groupe B, j'ai créé un ViewController comme ceci:

let vc: FakeViewController = FakeViewController()
vc.foo()

Alors, est-ce que l'interne est limité au même groupe? Ou je m'interprète mal?

Est-il utile que dans un contrôleur de vue vous créez des méthodes privées et des vars/let?

23
user1007522

@ user1007522 Pourriez-vous publier le code source complet de FakeViewController? Vous devriez avoir accès à foo () à partir de votre variable vc. Si vous ne le faites pas, je soupçonne que quelque chose d'autre est en jeu ici.

J'ai trouvé les définitions suivantes beaucoup plus faciles à comprendre (copie de UseYourLoaf - Swift 4 Niveaux d'accès )

Les cinq niveaux d'accès de Swift 3/4

Swift 3 a cinq niveaux d’accès qui contrôlent à partir de quel fichier ou module source vous pouvez accéder à quelque chose. Du plus ouvert au plus restreint:

  • open vous pouvez accéder aux classes ouvertes et aux membres de classe à partir de n'importe quel fichier source du module de définition ou de tout module qui importe ce module. Vous pouvez sous-classer une classe ouverte ou remplacer un membre de classe ouvert à la fois dans leur module de définition et dans tout module qui importe ce module.

  • public autorise le même accès que open - n'importe quel fichier source de n'importe quel module - mais comporte des sous-classes et des substitutions plus restrictives. Vous ne pouvez sous-classer qu'une classe publique dans le même module. Un membre de classe publique ne peut être remplacé que par des sous-classes du même module. Ceci est important si vous écrivez un cadre. Si vous voulez qu'un utilisateur de ce framework puisse sous-classer une classe ou remplacer une méthode, vous devez le rendre ouvert.

  • internal autorise l'utilisation à partir de n'importe quel fichier source du module de définition, mais pas de l'extérieur de ce module. C'est généralement le niveau d'accès par défaut.

  • fileprivate autorise uniquement l'utilisation dans le fichier source qui définit.

  • private Swift 4: autorise uniquement l'utilisation à partir de la déclaration englobante et nouvelle dans Swift 4, à toute extension de cette déclaration dans le même fichier source. Swift 3: autorise uniquement l'utilisation à partir de la déclaration englobante.

14
Michael Peterson

L'accès interne restreint l'accès aux fichiers dans une application ou une structure unique. 

Privé restreint l'accès au fichier source individuel dans lequel votre objet est créé. 

Voir this link pour une explication plus détaillée.

Globalement, si votre "groupe A" et votre "groupe B" appartiennent à la même application ou au même framework, vous devriez pouvoir accéder aux méthodes à partir de chacune d'elles, en supposant que viewController autorise l'accès interne.

9
Benjamin Lowry

Supposons que vous ayez 3 fichiers sources de contrôleur de vue différents: A, B, C Puis En privé: - Si les privilèges dans A sont privés, seules les méthodes de A peuvent les utiliser. que B et C peuvent facilement les utiliser. Voici un exemple:  enter image description here

Merci 

7
singh.jitendra

Je crois comprendre que private n'autorisera pas l'accès à la variable en dehors de cette classe. Cependant, il arrive parfois, comme avec les reconnaisseurs de geste, que vous ne puissiez pas les rendre privés car ils sont nécessaires en coulisse. En les marquant comme "internes", elles sont accessibles à partir d'autres fonctions, mais ne sont pas appelées directement.

La plupart du temps, j'utilise internal pour garder mon code organisé. Je sais donc que ce n'est pas une fonction destinée au public, mais qu'il peut quand même être utilisé.

0
EdwardSanchez