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

Mik*_*ike 34 variables static constants ios swift

有一些职位,如何编写代码static constantstatic variable斯威夫特.但目前尚不清楚何时使用static constantstatic variable,而不是constantvariable.谁能解释一下?

Luc*_*tti 85

当您将静态var/let定义到类(或结构)中时,该信息将在所有实例(或值)之间共享.

分享信息

class Animal {
    static var nums = 0

    init() {
        Animal.nums += 1
    }
}

let dog = Animal()
Animal.nums // 1
let cat = Animal()
Animal.nums // 2
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的,我创建了两个独立的实例,Animal但两者都共享相同的静态变量nums.

独生子

通常使用静态常量来采用Singleton模式.在这种情况下,我们希望分配不超过1个类的实例.为此,我们将对共享实例的引用保存在常量中,并隐藏初始化程序.

class Singleton {
    static let sharedInstance = Singleton()

    private init() { }

    func doSomething() { }
}
Run Code Online (Sandbox Code Playgroud)

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

Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.这很清楚地解释了.你能否确认我的理解是否正确:1.正如一些文档所提到的,静态变量和常量在这里是类型,而不是实例; 它可以像类的属性一样使用. (2认同)

Dar*_*ari 12

有一些关于如何在Swift中编写静态常量和静态变量代码的帖子.但目前尚不清楚何时使用静态常量和静态变量而不是常量和变量.谁能解释一下?将静态var/let定义为类(或结构)时,该值将在所有实例(或值)之间共享.

静态变量/类是可以访问的变量,无需创建任何实例/对象.

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()
Run Code Online (Sandbox Code Playgroud)

我想你知道常量和变量之间的区别.简而言之,不变的是它的价值永远不变; 上面例子中的numberOfEyes和变量是其值改变的值; 以上示例中的eyeDefect.

静态常量或变量放在内存(RAM)中,然后与对象分开.即numberOfEyes分配的内存空间与John对象不同,不在John内部.

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

  1. 当你使用单例设计模式时: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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当你需要全局相同的任何值时,不需要创建类的实例,就像人类中的numberOfEyes一样.

  3. 由于内存问题,不建议使用静态变量/常量,因为一旦实例化/分配,它将保留在内存中,直到您的应用程序从内存中删除.我发现到目前为止使用静态变量/常量的最佳位置只是在制作单例模式时,有时指针用于其他正常变量和常量不使用静态因为:内存问题,在代码中运行单元测试将很困难使用静态变量/常量.不建议像Human类一样使用.而是将它们用作常量或变量,并通过制作实例来访问它们.

    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)
    
    Run Code Online (Sandbox Code Playgroud)


小智 8

静态常量和变量确实属于类本身,而不属于特定实例。类也可以有静态方法,无需创建类的实例即可调用这些方法。

所以当你有一个MyClass带有静态 var的类时x,你也可以MyClass.x直接访问它。x将在一个类的所有实例之间共享