Estou tentando descobrir como declarar uma variável estática com escopo apenas localmente para uma função em Swift.
Em C, isso pode ser parecido com isto:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
Em Objective-C, é basicamente o mesmo:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Mas não consigo fazer nada parecido com Swift. Tentei declarar a variável das seguintes maneiras:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Mas tudo isso resulta em erros.
- O primeiro reclama "As propriedades estáticas só podem ser declaradas em um tipo".
- O segundo reclama "Declaração esperada" (onde
static
está) e "Padrão esperado" (ondetimesCalledB
está) - O terceiro reclama "As declarações consecutivas em uma linha devem ser separadas por ';'" (no espaço entre os dois pontos e
static
) e "Tipo esperado" (ondestatic
está) - O quarto reclama "Declarações consecutivas em uma linha devem ser separadas por ';'" (no espaço entre
Int
estatic
) e "Declaração esperada" (sob o sinal de igual)
struct Holder {…}
dentro de várias funções e elas não entrarão em conflito. Swift poderia suportarstatic let
sem estestruct
clichê ao redor.Outra solução
fonte
Swift 1.2 com Xcode 6.3 agora oferece suporte estático conforme o esperado. Das notas de lançamento do Xcode 6.3 beta:
Parece que as funções não podem conter declarações estáticas (como perguntado na pergunta). Em vez disso, a declaração deve ser feita no nível da classe.
Exemplo simples mostrando uma propriedade estática incrementada dentro de uma função de classe (também conhecida como estática), embora uma função de classe não seja necessária:
Resultado:
fonte
static
pode ser intencional da parte da Apple, embora seja sempre bem-vindo para registrar um bug para solicitar uma alteração. Em C,static
limita o armazenamento de uma variável ao escopo do arquivo-fonte (que nem sempre é o mesmo que o escopo da classe), enquanto o posicionamento da declaração da variável determina o escopo léxico (isto é, global vs dentro da função vs muitos-aninhados-{}
s). Em Swift, o escopo de armazenamento sempre segue o escopo léxico, portanto, você não pode ter uma variável que seja lexical para uma função e que tenha armazenamento global.Outra solução
fonte