Swift中的静态函数变量

时间:2014-08-18 00:23:53

标签: function static swift

我试图弄清楚如何在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

但这些都会导致错误。

  • 第一个抱怨"静态属性只能在#34;。
  • 类型上声明
  • 第二个投诉"预期声明" (static是)和"预期模式" (timesCalledB是)
  • 第三个投诉"一条线上的连续陈述必须用';'" (在冒号和static之间的空格中)和"预期类型" (static是)
  • 第四个投诉"一条线上的连续陈述必须用';'" (在Intstatic之间的空格中)和#34;预期声明" (在等号下)

4 个答案:

答案 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