2016-03-11 3 views
1

Je souhaite déclarer une variable privée dans une classe dans Swift et y accéder avec des méthodes publiques (en fait internes). Le code suivant est-il correct?Var privé dans une classe dans Swift

class someClass { 

    // Using underscore here to distinguish variable and method 
    private var _privateArray: [String] 
    ... 
    func privateArray() { 
    return _privateArray 
    } 

    func setPrivateArray(someArray: [String]) { 
    _privateArray = someArray 
    } 
} 

La raison pour laquelle je veux utiliser ce qui précède est parce que je veux utiliser le tableau dans toutes les sous-classes, mais avec un nom qui est significatif pour la sous-classe.

class someSubclass: someClass { 

    var arrayWithMeaningfulName: [String] 

    init() { 
    arrayWithMeaningfulName = super.privateArray() 
    ... 
    } 
} 

Vous ne savez pas si ce qui précède est la meilleure façon de réaliser ce que je veux. Soyez reconnaissant pour les commentaires.

D'ailleurs, j'ai essayé de déclarer la variable privée comme suit, mais le compilateur se plaint:

class someClass { 

    private var _privateArray: [String] { 
    get { 
     ... 
    } 

    set { 
    ... 
    } 
    ... 
+0

Qu'est-ce qui vous fait penser que ce n'est peut-être pas «à peu près juste»? –

+1

Quel serait l'avantage/l'utilisation des accesseurs publics pour une variable privée (question sérieuse)? – Koen

+0

'" La raison pour laquelle je veux utiliser ce qui précède est parce que je veux utiliser le tableau dans toutes les sous-classes, mais avec un nom significatif pour la sous-classe. "' Cela n'a pas beaucoup de sens pour moi. Bien sûr, je suis tout à fait pour des variables bien nommées, mais je pense que j'ai besoin d'un exemple plus concret de ce que vous essayez d'accomplir ici parce que cela n'a pas beaucoup de sens. – nhgrif

Répondre

0

Ce qui suit semble fonctionner.

class SomeClass { 

    // Using underscore here for consistency with my original post 
    private var _privateArray: [String] = ["a", "b", "c"] 

    func reverse() { 
     _privateArray = _privateArray.reverse() 
    } 
} 

class SomeSubclass: SomeClass { 

    // The array in this subclass is a computed property 
    var arrayWithMeaningfulName: [String] { 
     get { 
      return super._privateArray 
     } 

     set(newArray) { 
      super._privateArray = newArray 
     } 
    } 
} 

Important: SomeSubclass doit être défini dans le même fichier source SomeClass est définie dans pour elle d'avoir accès à l'initiative parlementaire _privateArray. Par exemple, si SomeClass a été défini dans le fichier SomeClass.swift, SomeSubclass doit également être défini dans le fichier SomeClass.swift. Sinon, le compilateur se plaindra avec le message "La valeur de type 'SomeClass' n'a pas de variable membre '_privateArray'." La méthode "reverse" consistait à démontrer qu'un code commun pouvait être défini dans la classe parent pour éviter la duplication, même si chaque sous-classe aurait un nom différent (plus significatif) pour la variable membre.

2

Si vous souhaitez déclarer un membre private, tout ce que vous avez à faire dans votre classe est:

class myClass { 

    private var _myVar = [String]() // For example 

    var myVar: [String] { 

     // Getter 
     get { 
      return self._myVar 
     } 

     // Setter 
     set(newValue) { 

      self._myVar = newValue 
     } 
    } 
} 
+0

Doh! Donc, juste pour confirmer, myVar est une propriété calculée? Je dois être trop fatigué ... merci. – Steve

+0

'myVar' est le membre de votre classe que vous voulez traiter ... donc oui c'est – Thomas

+0

alors que votre code est correct il ne fournit pas ce que je veux car je ne veux pas d'accès public à _myVar, même par myVar. – Steve

2

Notez que le livre Swift a les éléments suivants:

Vous pouvez donner un setter un accès inférieur leve l que le getter correspondant, pour restreindre l'étendue en lecture-écriture de cette variable, propriété, ou indice. Vous affectez un niveau d'accès inférieur en écrivant private (set) ou internal (set) avant l'introducteur var ou indice.

donc, dans votre exemple, vous pouvez simplement avoir

public class SomeClass { 
    public private(set) var privateArray: [String] = [] 
    public func setPrivateArray(array: [String]) { 
     // do some checking, possibly 
     self.privateArray = array 
    } 
} 

Votre code a diverses erreurs de syntaxe dans - vous manquez func sur vos fonctions publiques, et notez que vous ne pouvez pas donner une propriété ou fonctionner un plus grand niveau d'accès que son objet parent, vous devrez donc déclarer la classe elle-même comme public.

+0

Grimxn, merci de signaler les erreurs dans mon code douteux, j'espère que je les ai tous corrigés. Quand je dis "public", je veux dire vraiment le défaut, interne. – Steve