Я пытаюсь понять, как объявить статическую переменную, ограниченную только локально функцией в Swift.
В C это может выглядеть примерно так:
int foo() {
static int timesCalled = 0;
++timesCalled;
return timesCalled;
}
В Objective-C это в основном то же самое:
- (NSInteger)foo {
static NSInteger timesCalled = 0;
++timesCalled;
return timesCalled;
}
Но я не могу делать ничего подобного в Swift. Я пробовал объявить переменную следующими способами:
static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0
Но все это приводит к ошибкам.
- Первый жалуется: «Статические свойства могут быть объявлены только для типа».
- Второй жалуется на «Ожидаемое объявление» (где
static
есть) и «Ожидаемый образец» (гдеtimesCalledB
есть). - Третий жалуется: «Последовательные операторы в строке должны быть разделены символом ';'» (в пространстве между двоеточием и
static
) и «Ожидаемый тип» (гдеstatic
есть) - Четвертый жалуется: «Последовательные утверждения в строке должны быть разделены знаком "; "(в пробеле между
Int
иstatic
) и" Ожидаемое объявление "(под знаком равенства).
struct Holder {…}
внутри несколько функций, и они не будут конфликтовать. Swift мог бы поддерживатьstatic let
без этогоstruct
шаблона.Другое решение
источник
Swift 1.2 с Xcode 6.3 теперь поддерживает статику, как и ожидалось. Из примечаний к выпуску бета-версии Xcode 6.3:
Похоже, что функции не могут содержать статические объявления (как задано в вопросе). Вместо этого объявление должно выполняться на уровне класса.
Простой пример, показывающий статическое свойство, увеличиваемое внутри функции класса (также известной как статическая), хотя функция класса не требуется:
Вывод:
источник
static
может быть преднамеренной со стороны Apple, хотя всегда можно сообщить об ошибке, чтобы запросить изменение. В Cstatic
ограничивает хранение переменной областью видимости исходного файла (которая не всегда совпадает с областью видимости класса), в то время как размещение объявления переменной определяет лексическую область видимости (то есть глобальная или внутри функции vs многие-вложенные{}
). В Swift область хранения всегда следует за лексической областью, поэтому у вас не может быть переменной, лексической для функции и имеющей глобальное хранилище.Другое решение
источник