web-dev-qa-db-fra.com

Déclaration de variables globales dans Swift

Je veux créer un tableau global d'objets personnalisés accessibles dans toute l'application (AppDelegate, classes ViewController, classes TableViewController, etc.). J'ai recherché un moyen de le faire, mais je n'ai pas trouvé de réponse. J'ai essayé de donner au tableau une portée publique, mais j'obtiens un avertissement de conformité qui dit Declaring public variable from internal class et lorsque j'essaie d'y accéder dans un autre fichier, j'obtiens une erreur qui dit Use of unresolved identifier 'arrayObjectives'

Comment pourrais-je rendre ce tableau accessible à tous les fichiers de l'application et où puis-je instancier ce tableau?

27
Blake Morgan

À partir de Swift Programming Language -

Les variables globales sont des variables définies en dehors de toute fonction, méthode, fermeture ou contexte de type

Vous pouvez donc simplement déclarer votre variable en haut de n'importe quel fichier juste après les instructions import.

Cependant, je vous suggère de reconsidérer sérieusement. En général, les globaux ne sont pas une bonne idée. Il vaut mieux utiliser des propriétés sur un singleton ou utiliser l'injection de dépendances.

Votre deuxième question "où pourrais-je instancier le tableau?" fait partie des raisons pour lesquelles les globaux sont mauvais - leur cycle de vie n'est pas bien défini en termes de vos autres objets. Un singleton initialisé lors de la première utilisation élimine ce problème.

22
Paulw11

Vous pouvez définir un tableau global comme ceci:

import UIKit

var abc : String = String()

et vous pouvez y accéder dans n'importe quel autre fichier comme:

abc = "ABC"
14
Dharmesh

Essayez de créer un nouveau fichier Swift avec ceci:

struct Constants {

  static let appName: String = "My App"

  struct Colors {

    static let colorTextStandard = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3) //#000000

  }

  struct Data {

    static var myStrings = [String]()  // Yea, this is not a constant, but that's alright...

  }

}

Vous pouvez ensuite vous référer à ces constantes globales (ou vous pouvez les rendre variables) en utilisant:

Constants.appName

ou

Constants.Colors.colorTextStandard

ou

Constants.Data.myStrings = [stringOne, stringTwo]
11
sean

Voilà comment je l'ai fait ...

class MessageViewCell {
    struct MessageViewCellHeightCache {
        static var cache: [String:CGFloat] = Dictionary<String, CGFloat>()
    }
}

Et j'y ai accédé comme suit:

MessageViewCell.MessageViewCellHeightCache.cache["first"] = 12.0
6
anthonyliao