J'ai ces définitions dans ma fonction qui fonctionnent
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Mais si je déplace «testStr» et «testStrLen» au niveau de la classe, il ne se compilera pas. Il a dit 'MyClass.Type n'a pas de membre nommé' testStr '.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Comment puis-je réparer cela? Je ne veux pas payer la pénalité pour compter len d'un «test» constant à chaque fois.
Sur la base de ma compréhension des commentaires ci-dessous, je dois faire ceci:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Y a-t-il un moyen que je n'ai pas besoin de taper / entrer «test» deux fois? Merci.
Réponses:
Peut-être qu'un idiome intéressant pour déclarer des constantes pour une classe dans Swift est d'utiliser simplement une structure nommée MyClassConstants comme suit.
De cette façon, vos constantes seront étendues dans une construction déclarée au lieu de flotter globalement.
Mettre à jour
J'ai ajouté une constante de tableau statique, en réponse à un commentaire demandant l'initialisation du tableau statique. Voir Array Literals dans "The Swift Programming Language".
Notez que les littéraux de chaîne et la constante de chaîne peuvent être utilisés pour initialiser le tableau. Cependant, comme le type de tableau est connu, la constante entière
testStrLength
ne peut pas être utilisée dans l'initialiseur de tableau.la source
static
constantes dansStruct
et dansClass
es?MyClassConstants.testStr.rawValue
à accéder à la valeur, ce qui n'est pas aussi convivial du point de vue syntaxique que justeMyClassConstants.testStr
.Ajout à la réponse de @ Martin ...
Si quelqu'un envisage de conserver un fichier de constante au niveau de l'application, vous pouvez regrouper la constante en fonction de son type ou de sa nature
Appel :
Constants.MixpanelConstants.activeScreen
MISE À JOUR 5/5/2019 (un peu hors sujet mais 🤷🏽♂️)
Après avoir lu quelques directives de code et des expériences personnelles, il semble que les structures ne soient pas la meilleure approche pour stocker des constantes globales pour plusieurs raisons. En particulier, le code ci-dessus n'empêche pas l'initialisation de la structure. Nous pouvons y parvenir en ajoutant un code standard, mais il existe une meilleure approche
ENUMS
La même chose peut être obtenue en utilisant une énumération avec une représentation plus sûre et plus claire
la source
Si je comprends bien votre question, vous demandez comment vous pouvez créer des constantes au niveau de la classe (statiques - dans le langage C ++) de manière à ne pas a) répliquer la surcharge dans chaque instance, et b devoir recalculer ce qui est par ailleurs constant.
Le langage a évolué - comme chaque lecteur le sait, mais comme je le teste dans Xcode 6.3.1, la solution est:
Je ne sais pas si le statique est strictement nécessaire car le compilateur n'ajoute sûrement qu'une seule entrée par variable const dans la section statique du binaire, mais cela affecte la syntaxe et l'accès. En utilisant statique, vous pouvez vous référer à même lorsque vous ne disposez pas d' une instance:
MyClass.testStrLen
.la source
Si vous voulez réellement une propriété statique de votre classe, cela n'est actuellement pas pris en charge dans Swift. Le conseil actuel est de contourner cela en utilisant des constantes globales:
Si vous souhaitez plutôt qu'il s'agisse de propriétés d'instance, vous pouvez utiliser une propriété stockée différée pour la longueur - elle ne sera évaluée que lors du premier accès, vous ne la calculerez donc pas encore et encore.
la source
Qu'en est-il des propriétés calculées?
la source
Certains voudront peut-être que certaines constantes de classe soient publiques, d'autres privées.
Le mot-clé private peut être utilisé pour limiter la portée des constantes dans le même fichier swift.
D'autres classes pourront accéder à vos constantes de classe comme ci-dessous
la source
Essayé sur Playground
la source