Swift中的静态函数variables

我想弄清楚如何声明一个静态variables作用域本地只是一个函数在Swift中。

在C中,这可能看起来像这样:

int foo() { static int timesCalled = 0; ++timesCalled; return timesCalled; } 

在Objective-C中,它基本上是一样的:

 - (NSInteger)foo { static NSInteger timesCalled = 0; ++timesCalled; return timesCalled; } 

但是我似乎无法在Swift中做这样的事情。 我试过用以下方法声明variables:

 static var timesCalledA = 0 var static timesCalledB = 0 var timesCalledC: static Int = 0 var timesCalledD: Int static = 0 

但是这些都会导致错误。

  • 第一个抱怨“静态属性只能在types上声明”。
  • 第二个抱怨“预期声明”( static是)和“预期模式”(其中timesCalledB是)
  • 第三个抱怨:“一行中的连续语句必须用';'(在冒号和static之间的空格)和”Expected Type“(其中static表示static
  • 第四种抱怨:“一行中的连续语句必须用';'(在Intstatic之间的空格)和”Expected declaration“(在等号之下)

我不认为Swift支持静态variables没有附加到类/结构。 尝试使用静态variables声明一个私有结构。

 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 

解决scheme

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

使用Xcode 6.3的Swift 1.2现在支持静态。 从Xcode 6.3 beta发行说明:

“静态”方法和属性现在允许在类中(作为“类最终”的别名)。 您现在可以在类中声明静态存储的属性,这些属性具有全局存储,并在第一次访问(如全局variables)时被懒惰地初始化。 协议现在将types需求声明为“静态”需求,而不是将其声明为“类”需求。 (17198298)

看来,函数不能包含静态声明(如问题中所述)。 相反,宣言必须在课堂上完成。

简单的例子显示了一个静态属性在一个类(aka静态)函数中递增,尽pipe不需要类函数:

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

输出:

 1 2 3