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
) - 第四种抱怨:“一行中的连续语句必须用';'(在
Int
和static
之间的空格)和”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