J'essaie de comprendre comment déclarer une variable statique portée uniquement localement à une fonction dans Swift.
En C, cela pourrait ressembler à ceci:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
En Objective-C, c'est fondamentalement la même chose:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Mais je n'arrive pas à faire quelque chose comme ça dans Swift. J'ai essayé de déclarer la variable de la manière suivante:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Mais tout cela entraîne des erreurs.
- Le premier se plaint "Les propriétés statiques ne peuvent être déclarées que sur un type".
- Le second se plaint "Déclaration attendue" (où
static
est) et "Modèle attendu" (oùtimesCalledB
est) - Le troisième se plaint "Les instructions consécutives sur une ligne doivent être séparées par ';'" (dans l'espace entre les deux points et
static
) et "Type attendu" (oùstatic
est) - Le quatrième se plaint "Les déclarations consécutives sur une ligne doivent être séparées par ';'" (dans l'espace entre
Int
etstatic
) et "Déclaration attendue" (sous le signe égal)
struct Holder {…}
intérieur de plusieurs fonctions et elles ne se heurteront pas. Swift pourrait supporterstatic let
sans ce passe-struct
partout.Une autre solution
la source
Swift 1.2 avec Xcode 6.3 prend désormais en charge statique comme prévu. À partir des notes de version bêta de Xcode 6.3:
Il semble que les fonctions ne peuvent pas contenir de déclarations statiques (comme demandé en question). Au lieu de cela, la déclaration doit être faite au niveau de la classe.
Exemple simple montrant une propriété statique incrémentée dans une fonction de classe (aka statique), bien qu'une fonction de classe ne soit pas requise:
Production:
la source
static
pourrait être intentionnelle de la part d'Apple, bien que l'on soit toujours invité à déposer un bogue pour demander une modification. En C,static
limite le stockage d'une variable à la portée du fichier source (qui n'est pas toujours la même que la portée de la classe), tandis que le placement de la déclaration de variable détermine la portée lexicale (c.-à-d. Global vs dans la fonction vs plusieurs-imbriqués{}
). Dans Swift, la portée de stockage suit toujours la portée lexicale, vous ne pouvez donc pas avoir une variable lexicale d'une fonction et disposant d'un stockage global.Une autre solution
la source