tipos programacion parametros parametro opcional metodos funciones for externos datos function static swift

function - programacion - tipos de datos en swift



Variables de función estática en Swift (3)

No creo que Swift admita la variable estática sin tenerla asociada a una clase / estructura. Intente declarar una estructura privada con variable estática.

func foo() -> Int { struct Holder { static var timesCalled = 0 } Holder.timesCalled += 1 return Holder.timesCalled } 7> foo() $R0: Int = 1 8> foo() $R1: Int = 2 9> foo() $R2: Int = 3

Estoy tratando de averiguar cómo declarar una variable estática con un ámbito local únicamente a una función en Swift.

En C, esto podría verse más o menos 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 algo 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 de que "las propiedades estáticas solo pueden declararse en un tipo".
  • El segundo se queja de "declaración esperada" (donde static está) y "patrón esperado" (donde timesCalledB es)
  • El tercero se queja de que "las declaraciones consecutivas en una línea deben estar separadas por '';''" (en el espacio entre los dos puntos y static ) y el "Tipo esperado" (donde está static ).
  • El cuarto se queja de que "las declaraciones consecutivas en una línea deben estar separadas por '';''" (en el espacio entre Int y static ) y "Declaración esperada" (bajo el signo de igual)

Otra solución

func makeIncrementerClosure() -> () -> Int { var timesCalled = 0 func incrementer() -> Int { timesCalled += 1 return timesCalled } return incrementer } let foo = makeIncrementerClosure() foo() // returns 1 foo() // returns 2


Swift 1.2 con Xcode 6.3 ahora es compatible con la estática como se esperaba. De las notas de la versión beta de Xcode 6.3:

Los métodos y propiedades "estáticos" ahora están permitidos en las clases (como un alias para "clase final"). Ahora puede declarar propiedades almacenadas estáticas en clases, que tienen almacenamiento global y se inicializan de forma lenta en el primer acceso (como variables globales). Los protocolos ahora declaran los requisitos de tipo como requisitos "estáticos" en lugar de declararlos como requisitos de "clase". (17198298)

Parece que las funciones no pueden contener declaraciones estáticas (como se preguntó en la pregunta). En cambio, la declaración debe hacerse 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:

class StaticThing { static var timesCalled = 0 class func doSomething() { timesCalled++ println(timesCalled) } } StaticThing.doSomething() StaticThing.doSomething() StaticThing.doSomething()

Salida:

1 2 3