什么时候在Swift中使用静态常量和variables

有一些关于如何在Swift中编写static constantstatic variable代码。 但是不清楚何时使用static constantstatic variable而不是constantvariable 。 有人可以解释吗?

当你定义一个静态的var / let到一个类(或结构)时,这些信息将在所有的实例(或值)之间共享。

共享信息

 class Animal { static var nums = 0 init() { Animal.nums += 1 } } let dog = Animal() Animal.nums // 1 let cat = Animal() Animal.nums // 2 

正如你在这里所看到的,我创build了2个独立的Animal实例,但是它们都共享相同的静态variablesnums

独生子

通常使用一个静态常量来采用Singleton模式。 在这种情况下,我们希望不超过1个类的实例被分配。 要做到这一点,我们保存在一个常量内的共享实例的引用,我们隐藏初始化。

 class Singleton { static let sharedInstance = Singleton() private init() { } func doSomething() { } } 

现在当我们需要我们写的Singleton实例的时候

 Singleton.sharedInstance.doSomething() Singleton.sharedInstance.doSomething() Singleton.sharedInstance.doSomething() 

这种方法确实允许我们使用总是相同的实例,即使在应用程序的不同点。

有一些关于如何在Swift中编写静态常量和静态variables的代码。 但是不清楚何时使用静态常量和静态variables而不是常量和variables。 有人可以解释吗? 当你将一个静态var / let定义到一个类(或结构体)中时,该值将在所有实例(或值)之间共享。

静态variables/类是variables可以被访问而不需要创build任何实例/对象。

 class Human { static let numberOfEyes = 2 //human have only 2 eyes static var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable //other variables and functions } //you can access numberOfEyes like below no object of Human is created print(Human.numberOfEyes) print(Human.eyeDefect) //Object of Human let john = Human() 

我想你知道常数和variables之间的区别。 总之,不变的是,它的价值永不改变。 上面例子中的numberOfEyes和variables是其值的变化; 上例中的eyeDefect。

将静态常量或variables放在内存(RAM)中,然后单独放入对象。 即numberOfEyes有不同的内存空间分配比约翰对象,它不在里面约翰。

现在,何时使用静态常量/variables:

  1. 当你使用单例devise模式时:static let sharedInstance = APIManager()

     class APIManager(){ static let sharedInstance = APIManager() //Your other variables/functions here below } //Use it as to get singleton instance of APIManager from anywhere in your application let instanceOfAPIManager = APIManager.sharedInstance 
  2. 当你需要全局相同的任何东西的值时,不需要在人类中定义types为numberOfEyes的类的实例。

  3. 由于内存问题,不推荐使用静态variables/常量,因为一旦实例化/分配它,它将一直保留在内存中,直到应用程序从内存中移除。 我发现,直到现在最好的地方使用静态variables/常量只有当做单身模式,有时指针为其他正常variables和常量不使用静态,因为:内存问题,将很难在您的代码中运行unit testing与静态variables/常量。 不build议像人类一样使用。 而是将它们用作常量或variables,并通过实例来访问它们。

     class Human { let numberOfEyes = 2 //human have only 2 eyes var eyeDefect = false //whether human have side-effect or not. he can have defect later so its variable //other variables and functions } //you can access numberOfEyes like below if you need just those values. print(Human().numberOfEyes) print(Human().eyeDefect) 

静态常量和variables确实属于类本身,而不属于特定的实例。 一个类也可以有静态方法,可以不用创build一个类的实例而被调用。

所以当你有一个带有静态variablesx的类MyClass时,你也可以直接通过MyClass.x来访问它。 x将在一个类的所有实例中共享