什么是Swift中Objective C静态变量的类比?

时间:2015-08-01 05:07:47

标签: swift

在Objective C中使用静态变量非常方便(静态变量'值在所有函数/方法调用中保持),但是我找不到这样的东西在斯威夫特。

有这样的东西吗?

这是C:

中静态变量的一个例子
void func() {
    static int x = 0; 
    /* x is initialized only once across four calls of func() and
      the variable will get incremented four 
      times after these calls. The final value of x will be 4. */
    x++;
    printf("%d\n", x); // outputs the value of x
}

int main() { //int argc, char *argv[] inside the main is optional in the particular program
    func(); // prints 1
    func(); // prints 2
    func(); // prints 3
    func(); // prints 4
    return 0;
}

2 个答案:

答案 0 :(得分:5)

在看到更新的答案后,以下是Objective-C代码的修改:

func staticFunc() {    
    struct myStruct {
        static var x = 0
    }

    myStruct.x++
    println("Static Value of x: \(myStruct.x)");
}

致电是您班上的任何地方

staticFunc() //Static Value of x: 1
staticFunc() //Static Value of x: 2
staticFunc() //Static Value of x: 3

答案 1 :(得分:2)

将变量声明在文件的顶层(任何类之外),称为全局变量。

  

文件顶层的变量被懒惰地初始化!那么你   可以将变量的默认值设置为   读取文件,直到您的代码才会实际读取该文件   首先要求变量的值。

来自HERE的参考。

<强>更新

从您的C示例中,您可以通过这种方式快速实现相同的目标:

var x = 0   //this is global variable 

func staticVar() {
    x++
    println(x)
}

staticVar()
x                //1
staticVar()
x                //2
staticVar()
x                //3

用操场测试。

来自Apple Document

  

在C和Objective-C中,您可以定义静态常量和变量   与类型相关联的全局静态变量。但是,在Swift中,   type属性是作为类型定义的一部分写入的   类型的外部花括号,每个类型属性都是显式的   范围限定为它支持的类型。

     

使用static关键字定义类型属性。对于计算类型   类类型的属性,您可以使用class关键字来代替   允许子类覆盖超类的实现。该   下面的示例显示了存储和计算类型的语法   属性:

struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
    // return an Int value here
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        // return an Int value here
    }
}
class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        // return an Int value here
    }
    class var overrideableComputedTypeProperty: Int {
        // return an Int value here
    }
}
  

注意

     

上面的计算类型属性示例是针对只读计算类型&gt;属性,但您也可以定义读写计算   使用与计算实例相同的语法键入属性   属性。