Estoy tratando de averiguar cómo declarar una variable estática con alcance solo localmente a una función en Swift.
En C, esto podría verse así:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
En Objective-C, es básicamente lo mismo:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Pero parece que no puedo hacer nada como esto en Swift. Intenté declarar la variable de las siguientes maneras:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Pero todos estos resultan en errores.
- El primero se queja "Las propiedades estáticas solo se pueden declarar en un tipo".
- El segundo se queja "Declaración esperada" (donde
static
está) y "Patrón esperado" (dondetimesCalledB
está) - El tercero se queja "Las declaraciones consecutivas en una línea deben estar separadas por ';'" (en el espacio entre los dos puntos y
static
) y "Tipo esperado" (dondestatic
está) - El cuarto se queja "Las declaraciones consecutivas en una línea deben estar separadas por ';'" (en el espacio entre
Int
ystatic
) y "Declaración esperada" (bajo el signo igual)
struct Holder {…}
dentro de múltiples funciones y no colisionarán. Swift podría soportarstatic let
sin estastruct
repetición.Otra solución
fuente
Swift 1.2 con Xcode 6.3 ahora admite estática como se esperaba. De las notas de la versión beta de Xcode 6.3:
Parece que las funciones no pueden contener declaraciones estáticas (como se hace en la pregunta). En cambio, la declaración debe realizarse a nivel de clase.
Ejemplo simple que muestra una propiedad estática incrementada dentro de una función de clase (también conocida como estática), aunque no se requiere una función de clase:
Salida:
fuente
static
podría ser intencional por parte de Apple, aunque siempre se puede presentar un error para solicitar un cambio. En C,static
limita el almacenamiento de una variable al alcance del archivo fuente (que no siempre es el mismo que el alcance de la clase), mientras que la ubicación de la declaración de la variable determina el alcance léxico (es decir, global vs dentro de la función vs muchos anidados{}
). En Swift, el alcance de almacenamiento siempre sigue el alcance léxico, por lo que no puede tener una variable que sea léxica para una función y que tenga almacenamiento global.Otra solución
fuente