我试图弄清楚如何在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
之间的空格中)和#34;预期声明" (在等号下)答案 0 :(得分:135)
我认为Swift不支持静态变量而不将其附加到类/结构中。尝试使用静态变量声明私有结构。
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
答案 1 :(得分:22)
另一种解决方案
func makeIncrementerClosure() -> () -> Int {
var timesCalled = 0
func incrementer() -> Int {
timesCalled += 1
return timesCalled
}
return incrementer
}
let foo = makeIncrementerClosure()
foo() // returns 1
foo() // returns 2
答案 2 :(得分:19)
Swift 1.2 with Xcode 6.3现在支持静态。从Xcode 6.3 beta版发行说明:
现在允许在类中使用“静态”方法和属性(作为 “class final”的别名。您现在可以声明静态存储 类中的属性,具有全局存储并且是懒惰的 在第一次访问时初始化(如全局变量)。现在的协议 声明类型要求为“静态”要求而不是 宣称它们是“阶级”要求。 (17198298)
似乎函数不能包含静态声明(如所讨论的那样)。相反,声明必须在班级进行。
显示静态属性在类(也称为静态)函数内递增的简单示例,但不需要类函数:
class StaticThing
{
static var timesCalled = 0
class func doSomething()
{
timesCalled++
println(timesCalled)
}
}
StaticThing.doSomething()
StaticThing.doSomething()
StaticThing.doSomething()
输出:
1
2
3
答案 3 :(得分:0)
另一种解决方案
package.json