2017-01-20 1 views
10

Je veux créer une classe qui hérite d'une autre classe, qui se trouve dans un fichier différent.Comment déclarer une variable 'protégée' dans swift

Par exemple:

Class1.swift

class Class1 
{ 
    protected var 
    //Do Stuff 
} 

Class2.swift

class Class2:Class1 
{ 
    //Do stuff 
} 

Comment puis-je avoir beable accsess à a'protected » variable/fonction en rapide?

Lorsque je déclare une variable/fonction privée, je ne peux l'utiliser que dans cette classe. Si j'utilise 'fileprivate', mon autre classe DOIT être dans le fichier de sauvegarde en tant que Class1. Ce que je veux faire, c'est garder mes classes dans des fichiers séparés et utiliser les groupes depuis Xcode pour savoir quelle classe appartient à quelle catégorie.

+0

double possible de [Est-ce que Swift ont des modificateurs d'accès?] (http://stackoverflow.com/questions/24003918/does-swift-have-access-modifiers) – Sulthan

+0

@Sulthan J'ai vu ce poste becase il n'a rien dit de 'protégé'. Cela aurait pu être quelque chose qui a été ajouté dans une version ultérieure de swift, ou être accsessed d'une manière différente. – iProgram

+0

Un groupe dans Xcode n'a rien à voir avec la compilation ou avec le langage lui-même. C'est juste un moyen de grouper logiquement les fichiers dans votre projet, de la même manière que les dossiers de votre système de fichiers. Si vous voulez séparer l'implémentation, vous devrez utiliser * modules *, c'est-à-dire * targets * dans le projet. Et puis utilisez 'internal'. – Sulthan

Répondre

14

Vous devrez utiliser internal pour cela car Swift n'offre pas de mot-clé protected (contrairement à de nombreux autres langages de programmation). internal est le seul modificateur d'accès entre fileprivate et public:

L'accès interne permet aux entités d'être utilisées dans un fichier source de leur module définissant, mais pas dans un fichier source en dehors de ce module . Vous utilisez généralement un accès interne lors de la définition d'une structure interne d'une application ou d'une structure .

Il y a un blog post qui explique un peu plus sur pourquoi les concepteurs de langage choisi de ne pas offrir un mot-clé protected (ou quoi que ce soit l'équivalent).

Certaines des raisons étant que

Il n'offre pas réellement de protection réelle, car une sous-classe peut toujours exposons API « protégée » par une nouvelle méthode publique ou d'un bien.

et aussi le fait que protected poserait des problèmes en ce qui concerne les extensions, car il ne serait pas clair si les extensions devraient également avoir accès à protected propriétés ou non.

+0

Merci pour la réponse. Je savais qu'il y avait interne, mais puisque tout le code est dans une unité, cela signifie que je peux aussi bien l'avoir que public. – iProgram

+0

@iProgram Mais c'est le problème. Vous avez tout le code dans une unité. – Sulthan

+0

C'était la façon dont les applications devaient être. Donc, quand vous faites des applications, tout devrait être dans différentes unités? Si oui, quelle est la meilleure façon de le faire? Ou est-ce pour un autre sujet? Bien que je ne sois pas nouveau au développement, je le suis si vous savez ce que je veux dire. – iProgram

0

Même si Swift ne fournit pas protected l'accès, encore nous peut obtenir un accès similaire en utilisant fileprivate contrôle d'accès.
La seule chose que nous devons garder à l'esprit que nous devons déclarer tous les enfants dans le même fichier que parent déclaré dans.

Animal.swift

import Foundation 

class Animal { 
    fileprivate var protectedVar: Int = 0 
} 

class Dog: Animal { 
    func doSomething() { 
     protectedVar = 1 
    } 
} 

otherFile.rapide

let dog = Dog() 
dog.doSomething() 
+2

Le problème est la superclasse et la sous-classe devra être dans le même fichier. Ce serait un problème de conception de code. – DEADBEEF