何时在Swift中使用静态常量和变量?
在Swift中,当我们需要在一个类中创建一个常量或变量,并且这个常量或变量属于这个类本身,而不是类的实例时,我们可以使用静态常量和变量。
静态常量和变量属于类本身,而不是特定的实例。一个类也可以有静态方法,可以在不创建类的实例的情况下调用。
例如,当我们有一个类MyClass,并在其中定义了一个静态变量x时,我们可以直接通过MyClass.x访问它。x将在类的所有实例之间共享。
这种使用静态常量和变量的情况可以有很多,例如在计算某个类的实例个数时可以使用静态变量来进行计数。又或者当我们需要在多个实例之间共享某个值时,可以使用静态变量。
总之,使用静态常量和变量可以方便地在类的所有实例之间共享数据,而不需要创建实例。这是Swift中一种灵活且有用的编程方式。
在Swift中,有一些关于如何编写静态常量和静态变量的帖子。但是,什么时候使用静态常量和静态变量而不是常量和变量不太清楚。有人可以解释一下吗?
当您在类(或结构体)中定义静态var/let时,该值将在所有实例(或值)之间共享。
静态变量/类是可以在不创建任何实例/对象的情况下访问的变量。
class Human {
static let numberOfEyes = 2 //人类只有两只眼睛
static var eyeDefect = false //人类是否有副作用。他以后可能会有缺陷,所以是变量
//其他变量和函数
}
//您可以像下面这样访问numberOfEyes,无需创建Human对象
print(Human.numberOfEyes)
print(Human.eyeDefect)
//Human对象
let john = Human()
我认为您知道常量和变量的区别。简而言之,常量的值永远不会改变;上述示例中的numberOfEyes,而变量的值会改变;上述示例中的eyeDefect。
静态常量或变量位于内存(RAM)中与对象分开的位置。也就是说,与John对象不同,numberOfEyes有不同的内存空间分配,它不在John对象内部。
那么,什么时候使用静态常量/变量:
- 当您使用单例设计模式时:static let sharedInstance = APIManager()
class APIManager(){
static let sharedInstance = APIManager()
//您的其他变量/函数在下面
}
//在应用程序的任何地方使用它,以获取APIManager的单例实例
let instanceOfAPIManager = APIManager.sharedInstance
- 当您需要全局相同的任何值,而无需创建该值所在类的实例,例如human类中的numberOfEyes。
- 不太推荐使用静态变量/常量,因为会出现内存问题,因为一旦实例化/分配,它将一直驻留在内存中,直到应用程序从内存中删除。到目前为止,我发现使用静态变量/常量的最佳场所仅仅是在创建单例模式时以及其他普通变量和常量的指针时使用静态变量/常量是不推荐的原因是:内存问题,使用静态变量/常量将使您的代码难以运行单元测试。不推荐像Human类一样使用它们,而是将它们用作常量或变量,并通过创建实例来访问它们。
class Human {
let numberOfEyes = 2 //人类只有两只眼睛
var eyeDefect = false //人类是否有副作用。他以后可能会有缺陷,所以是变量
//其他变量和函数
}
//如果只需要这些值,可以像下面这样访问numberOfEyes。
print(Human().numberOfEyes)
print(Human().eyeDefect)
在Swift中使用静态常量和变量的时机?
在Swift中,当你将一个静态变量/常量定义到一个类(或结构体)中时,这些信息将在所有实例(或值)之间共享。
共享信息
class Animal {
static var nums = 0
init() {
Animal.nums += 1
}
}
let dog = Animal()
Animal.nums // 1
let cat = Animal()
Animal.nums // 2
如你所见,我创建了两个独立的Animal实例,但它们都共享了同一个静态变量nums。
单例
通常,静态常量被用来采用单例模式。在这种情况下,我们希望只分配一个类的实例。
为了做到这一点,我们将对共享实例的引用保存在一个常量中,并隐藏初始化器。
class Singleton {
static let sharedInstance = Singleton()
private init() { }
func doSomething() { }
}
现在,当我们需要Singleton实例时,我们可以写成:
Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
Singleton.sharedInstance.doSomething()
这种方法允许我们始终使用同一个实例,即使在应用程序的不同点。
谢谢。这解释得非常清楚。你能确认我的理解是否正确吗:1.如一些文档所述,静态变量和常量在这里是类型,而不是实例;2.它可以像类的属性一样使用。
1)静态变量/常量可以引用一个类的实例(就像在我的Singleton示例中一样),或者可以存储一个值(就像在Animal示例中一样)。就像普通的变量/常量一样。2)是的,我们可以将静态变量/常量视为属于类本身而不是实例的属性。
谢谢。现在我完全明白如何使用静态了。
静态变量在类中是在类级别上的,而不是对象级别的(我们不需要初始化类就可以访问变量)。
静态变量在不同实例之间具有相同的引用。
静态变量对子类不可见。
非常感谢。这对我来说太久太困惑了。现在我明白了。
非常感谢。除了静态属性,我现在也明白了单例是什么。