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?
À 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.
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"
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]
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