N'Swift ont des modificateurs d'accès?
En Objective-C données d'instance peut être public
, protected
ou private
. Par exemple:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
Je n'ai pas trouvé de mention de modificateurs d'accès à la référence Swift. Est-il possible de limiter la visibilité des données de Swift?
Moi non plus. Apple devrait au moins présenter l'étiquette pour les particuliers, comme en python, ils sont préfixés par le caractère de soulignement.
Ajout d'une réponse de mise à jour pour final version de Xcode 6.1.1
Swift 4 mise à jour de la réponse.
Ajout d'une réponse de mise à jour pour final version de Xcode 6.1.1
Swift 4 mise à jour de la réponse.
OriginalL'auteur Gergo Erdosi | 2014-06-02
Vous devez vous connecter pour publier un commentaire.
Comme de Swift 3.0.1, 4 niveaux d'accès, décrit ci-dessous à partir de la plus élevée (la moins restrictive) à la plus basse (la plus restrictive).
1.
open
etpublic
Permettre à l'entité à être utilisés en dehors de la définition de module (cible). Vous utilisez généralement
open
oupublic
d'accès lors de la spécification de l'interface publique d'un cadre de référence.Cependant,
open
d'accès s'applique que pour les classes et les membres de la classe, et il diffère depublic
accès comme suit:public
les classes et les membres de la classe ne peut être sous-classé et remplacé dans le module de définition (cible).open
les classes et les membres de la classe peuvent être sous-classé et substituée à la fois au sein et en dehors de la définition de module (cible).2.
internal
Permet à une entité à être utilisé dans la définition de module (cible). Vous utilisez généralement
internal
d'accès lors de la définition d'une application ou d'un cadre interne de la structure.3.
fileprivate
Restreint l'utilisation d'une entité à sa définition de la source du fichier. Vous utilisez généralement
fileprivate
accès à cacher les détails d'implémentation des fonctions bien spécifiques lorsque ces données sont utilisées dans le fichier en entier.4.
private
Restreint l'utilisation d'une entité de son joignant la déclaration. Vous utilisez généralement
private
accès à cacher les détails d'implémentation des fonctions bien spécifiques lorsque ces données sont utilisées uniquement dans une seule déclaration.Il y a toujours sont quelques méthodes ou variables en programmation orientée objet, qui doit être privé ou protégé. Cela permet la mise en œuvre de conception SOLIDE, grosse méthodes sont divisées en un certain nombre de plus petites, chacune avec sa propre responsabilité, qui peut être remplacé, mais seulement de la "main" de la méthode doivent être disponibles pour une utilisation publique.
J'ai, personnellement, n'aime pas les solutions comme celle avec le trait de soulignement/special-char "privé". Même si il est garanti que j'ai pour moi-même serez la seule personne à avoir jamais eu un coup d'oeil à ce code, il rend le code plus enregistrer / moins sujettes à des erreurs cause le compilateur va tout simplement vous empêcher de faire des choses que vous ne devriez pas le faire. Donc je pense qu'ils devraient sortir les "mécanismes de contrôle d'accès" aussi vite que possible, afin que les gens l'habitude de prendre de mauvaises habitudes.
Xcode 6 bêta notes de dire: "contrôle d'Accès (public/privé) n'est pas activé dans cette graine. (15747445)"
L'idée d'un public interface est très précieux. Si vous avez l'intention de l'ensemble du code dans une classe doit résider à l'intérieur des fonctions qui font partie de l'API publique, je pense que c'est assez limitant. D'autre part, avoir un public spécifié API permet la mise en œuvre du changement (y compris l'utilisation de méthodes privées) sans perturber les consommateurs. Si quelqu'un "besoin" pour utiliser une classe interne méthode je pense qu'ils sont mal à comprendre les limites de la classe de fonctionnalité (ou essayez d'utiliser un buggy de classe).
OriginalL'auteur akashivskyy
Swift 4
Comme mentionné par le Swift Documentation - Contrôle D'Accès, Swift 4 a 5 Contrôles d'Accès:
ouvrir et public: peut être consulté à partir de leur module d'entités et de n'importe quel module, les entités qui importe le module de définition.
interne: ne peut être consulté à partir de leur module d'entités. C'est le niveau d'accès par défaut.
fileprivate et privé: ne peuvent être accessibles que dans limitée à l'intérieur d'un champ d'application limité où vous les définir.
Quelle est la différence entre ouvrir et public?
ouvrir est le même que le public dans les versions précédentes de Swift, ils permettent à des classes à partir des autres modules à l'utilisation et à l'héritage, j'.e: ils peuvent être sous-classé par d'autres modules. Aussi, ils permettent aux membres d'autres modules à utiliser et à remplacer. La même logique vaut pour leurs modules.
public permettent à des classes à partir d'un autre module, mais pas hériter d'eux, j'.e: ils ne peut pas être sous-classé par d'autres modules. Aussi, ils permettent aux membres d'autres modules pour les utiliser, mais PAS de les remplacer. Pour les modules, ils ont même ouvert la logique (ils permettent à des classes d'utilisation et d'héritage; Ils permettent aux membres d'utiliser et de les remplacer).
Quelle est la différence entre fileprivate et privé?
fileprivate peut être consulté à partir de l'ensemble de leurs fichiers.
privé ne peut être consulté à partir de leur déclaration unique et à extensions de cette déclaration qui sont dans le même fichier; Par exemple:
Quelles sont les différences entre Swift 3 et Swift 4 Contrôle d'Accès?
Comme mentionné dans le SE-0169 proposition, le seul raffinement a été ajouté à Swift 4, la privé de contrôle d'accès de la portée a été élargie afin d'être accessible à partir de extensions de cette déclaration dans le même fichier; Par exemple:
Donc, il n'est pas nécessaire de déclarer
myMessage
comme fileprivate pour être accessible à l'ensemble du fichier.barre latérale remarque: Si vous face à des questions liées à la pas la compilation de Swift 4 avec migré âgées Swift 3 du projet, vous pouvez consulter la cette Q&A.
OriginalL'auteur Ahmad F
Lorsque l'on parle de prendre une "méthode" de Swift ou ObjC (ou ruby ou java, ou...), ces méthodes ne sont pas vraiment privé. Il n'y a pas de réel contrôle d'accès autour d'eux. Une langue qui offre tout de même un peu d'introspection permet aux développeurs d'obtenir ces valeurs à partir de l'extérieur de la classe, si ils veulent vraiment.
Donc ce que nous avons vraiment parler ici est un moyen de définir un public interface simple présente les fonctionnalités que nous voulons, et "cache" du reste ce que nous considérons comme "privé".
La Swift mécanisme permettant de déclarer des interfaces est la
protocol
, et il peut être utilisé à cette fin.Rappelez-vous, les protocoles sont les premiers types de classe et peut être utilisé n'importe où un type peut. Et, lorsqu'il est utilisé de cette façon, ils n'exposent que leurs propres interfaces, et non pas ceux de la mise en œuvre de type.
Ainsi, aussi longtemps que vous utilisez
MyClass
au lieu deMyClassImplementation
dans vos types de paramètres, etc. il devrait tout juste travail:Il y a certains cas de l'affectation directe où vous devez être explicite avec le type au lieu de s'appuyer sur Swift à déduire, mais cela ne semble guère un briseur d'affaire:
En utilisant des protocoles de cette façon, la sémantique, raisonnablement concis, et à mes yeux ressemble beaucoup à la Classe Extentions nous avons été en utilisant à cette fin en ObjC.
Je ne comprends pas ce que tu veux dire. L'exemple suivant crée une méthode publique avec un paramètre facultatif. Il ne semble pas être un problème: gist.github.com/anonymous/17d8d2d25a78644046b6
Pour une raison quelconque, le paramètre facultatif ne fonctionne pas comme il se doit sur mon projet, avait déjà essayé quelque chose de similaire à votre GitHub exemple. Comme nous ne pouvons pas définir un paramètre par défaut sur un protocole, je me suis coincé et finit par lui poser une question. Merci d'essayer de l'aider.
Nous savons tous que tout est piratable. Nous avons juste besoin d'ordonnance ce qui est pourquoi nous avons besoin de modificateurs d'accès
OriginalL'auteur jemmons
Aussi loin que je peux dire, il n'y a pas de mots clés "public", "privé" ou "protégé". Cela donnerait à penser que tout est public.
Cependant Apple peut être attendre que les gens à utiliser “les protocoles” (appelées interfaces par le reste du monde) et le l'usine modèle de conception pour masquer les détails de la mise en œuvre de type.
C'est souvent un bon modèle de conception à utiliser de toute façon; il vous permet de changer votre mise en œuvre hiérarchie de classe, tout en gardant la logique type de système de la même.
Que se serait mieux si il y avait un moyen de cacher la classe d'implémentation du protocole, mais il ne semble pas y être.
Quelqu'un peut-il fournir un exemple illustratif de cette tendance?
Eh bien, cette réponse est valable dans le précédent Swift version(s), il semble qu'il n'est plus valable 🙂 s'il vous plaît vérifier ma réponse.
OriginalL'auteur Ian Ringrose
À l'aide d'une combinaison de protocoles, les fermetures, et imbriquée/classes internes, il est possible de l'utiliser quelque chose le long des lignes du motif de module de cacher des informations dans Swift droit maintenant. Ce n'est pas super propre ou agréable à lire mais il fonctionne.
Exemple:
innerVal et mysteriousMath sont cachés ici, à partir d'une utilisation à l'extérieur et à tenter de creuser votre chemin dans l'objet devrait en résulter une erreur.
Je suis seulement une partie de la voie à travers ma lecture de la Swift docs donc si il y a une faille ici s'il vous plaît le signaler, aimerait savoir.
Swift est de type sécurisé et la seule chose que le monde extérieur sait à propos de h, c'est qu'il est conforme à HuhThing. HuhThing ne comprennent pas toutes les informations à propos d'une propriété appelée innerVal et ainsi de tenter d'accéder c'est une erreur.
Toujours accessible 😛
reflect(h)[0].1.value // 19
Nice y trouver John - je n'étais pas au courant de réfléchir. Semble de faire tourner des objets dans les Tuples - est-il de toute la documentation officielle sur cette fonction ou d'autres métaprogrammation trucs dans Swift? J'ai pris un coup d'oeil par le biais de la langue guide sur iBooks, mais je ne suis pas le voir.
Je ne pense pas que la réflexion compte. En Java (un de plus mature de la langue), il y a modificateurs d'accès, mais ils n'empêchent pas la réflexion astuces.
OriginalL'auteur Dave Kapp
De Xcode 6 bêta 4, Swift a des modificateurs d'accès. Depuis les notes de version:
L'implicite par défaut est
internal
, donc au sein d'une application cible, vous pouvez laisser des modificateurs d'accès large à l'exception de l'endroit où vous voulez être plus restrictif. Dans un cadre de cible (par exemple, si vous êtes à l'intégration d'un cadre de partage de code entre une application et d'un partage ou d'aujourd'Hui, vue de l'extension), l'utilisationpublic
pour désigner l'API vous souhaitez exposer à des clients de votre cadre.OriginalL'auteur rickster
Swift 3.0 offre cinq différents contrôles d'accès:
D'Accès Par Défaut Des Niveaux
Toutes les entités de votre code (avec quelques exceptions) ont un niveau d'accès par défaut de l'intérieur si vous ne spécifiez pas explicitement un niveau d'accès vous-même. En conséquence, dans de nombreux cas, vous n'avez pas besoin de spécifier explicitement un niveau d'accès dans votre code.
La publication note sur le sujet:
Plus d'informations & détails :
Le Langage De Programmation Swift (Contrôle D'Accès)
OriginalL'auteur CryingHippo
En Bêta 6, la documentation indique qu'il existe trois différents modificateurs d'accès:
Et ces trois-là s'appliquent à des Classes, des Protocoles, des fonctions et des propriétés.
Pour plus, consultez Contrôle D'Accès.
Eh bien, cette réponse est valable dans le précédent Swift version(s), il semble qu'il n'est plus valable 🙂 s'il vous plaît vérifier ma réponse.
OriginalL'auteur OliverAssad
Mécanismes de contrôle d'accès comme introduit dans Xcode 6:
Par défaut accecss il interne, et n'a pas besoin d'être spécifiée. Notez également que le privé spécificateur de ne pas de travail sur le niveau de la classe, mais sur le fichier source. Cela signifie que pour obtenir des pièces d'une classe vraiment privé, vous avez besoin de séparer dans un fichier qui lui est propre. Cela introduit aussi quelques cas intéressants en ce qui concerne les tests unitaires,...
Un autre point me fait, ce qui est commentée dans le lien ci-dessus, c'est que vous ne pouvez pas mettre à jour le niveau d'accès. Si vous sous-classe quelque chose, vous pouvez limiter plus, mais pas l'inverse.
De ce dernier affecte également les fonctions, les tuples et sûrement d'autres choses dans la façon que si c'est à dire une fonction utilise un privé classe, alors il n'est pas valide pour la fonction interne ou public, car ils peuvent ne pas avoir accès à la privé classe. Il en résulte un avertissement du compilateur, et vous avez besoin de redeclare la fonction comme un privé fonction.
OriginalL'auteur holroy
Pour Swift 1-3:
Non, il n'est pas possible. Il n'y a pas privé/protégé de méthodes et de variables.
Tout est public.
Mise à jour
Depuis Swift 4, il est possible de voir d'autres réponses dans ce thread
Ce commentaire est exact pour la graine.
C'est une mauvaise nouvelle. 🙁
Pour la graine. Il apparaîtra dans l'avenir.
"public" / "protégés" / "privé" n'existent pas actuellement, mais vous pouvez cacher des choses à l'aide de fermetures, les protocoles et les classes internes - ce qui le rend un peu comme le motif de module utilisé en JavaScript couramment. Veuillez voir mon exemple de code sur ma réponse ici pour un exemple de comment faire cela. Si je ne me trompe au sujet de la façon dont il fonctionne et mon exemple est incorrect, veuillez le signaler que je suis encore à apprendre aussi. 🙂
OriginalL'auteur Sam
L'une des options que vous pouvez utiliser est d'envelopper la création de l'instance dans une fonction et de faire parvenir les getters et les setters dans un constructeur:
OriginalL'auteur Bartosz Ciechanowski
Maintenant en version bêta 4, ils ont ajouté des modificateurs d'accès à Swift.
de Xcode 6 bêta 4 réalésé notes:
Eh bien, cette réponse est valable dans le précédent Swift version(s), il semble qu'il n'est plus valable 🙂 s'il vous plaît vérifier ma réponse.
OriginalL'auteur Alexey Globchastyy
Swift 3 et 4 a apporté beaucoup de changement également pour les niveaux d'accès des variables et des méthodes. Swift 3 et 4 a maintenant 4 niveaux d'accès différents, où ouvrir/public d'accès est la plus élevée (la moins restrictive) niveau d'accès et privé l'accès est le plus bas (la plus restrictive) niveau d'accès:
Intéressant:
Au lieu de marquage de chaque méthode unique ou membre comme "privé", vous pouvez couvrir certaines méthodes (par exemple, généralement des fonctions d'assistance) dans une extension d'un class /struct et marque l'ensemble de l'extension comme "Privé".
Cela peut être une bonne idée, afin d'obtenir un meilleur code maintenable. Et vous pouvez changer facilement (par exemple, pour les tests unitaires) à la non-privé en changeant juste un mot.
La documentation d'Apple
mise à jour pour Swift 4: Merci @Ahmad F
OriginalL'auteur LukeSideWalker
La langue grammaire n'a pas les mots clés "public", "privé" ou "protégé". Cela donnerait à penser que tout est public. Bien sûr, il pourrait y avoir une autre méthode de spécification des modificateurs d'accès sans ces mots-clés, mais je ne pouvais pas le trouver dans la langue de référence.
OriginalL'auteur Scroog1
Nous l'espérons, de gagner du temps pour ceux qui veulent quelque chose de semblable pour les méthodes protected:
Comme pour les autres réponses, swift, qui constitue désormais le "privé" modificateur - qui est définie fichier-sage plutôt que de classe-sage, tels que ceux en Java ou en C# par exemple. Cela signifie que si vous voulez protéger méthodes, vous pouvez le faire avec swift méthodes privées si ils sont dans le même fichier
par exemple, le Fichier 1:
Fichier 2:
}
OriginalL'auteur james_alvarez
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
DE DÉPART SWIFT 2.2 😉
Par défaut Interne
OriginalL'auteur OliverAssad
jusqu'swift 2.0 il n'y avait que trois niveau d'accès Public, privé interne]
mais dans swift 3.0 apple a ajouté deux nouveaux accès, de niveau [ Ouvert, type de fichier ] de sorte que
maintenant swift 3.0 il y a 5 niveau d'accès
Ici, je veux clairement le rôle de ces deux niveau d'accès
1. Ouvert: il est beaucoup semblable à Public, mais la seule différence est que le Public
peuvent accéder à la sous-classe et de remplacement, et d'Ouvrir l'accès du niveau d'accès que cette image est tirée de la Moyenne site web, et ce de décrire la différence entre l'ouverture et l'accès du public
Maintenant à la deuxième nouveau niveau d'accès
2. type de fichier est plus grande version du privé ou moins le niveau d'accès qu'interne
Le type de fichier peut accéder à la partie étendue de l' [class, struct, enum]
et de privé ne peut pas accéder à la partie étendue de code, il ne peut accéder à la
portée lexicale
cette image est tirée de la Moyenne site, ce qui décrivent la différence entre le type du fichier et l'accès Privé au niveau
OriginalL'auteur Dilip Tilonia