static 关键字在 Swift 中的作用

1,674 阅读2分钟

今天和群里小伙伴讨论到 static ,发现自己并没有特别了解 static 这个关键字。

  1. 在 Swift 中的 static 究竟是什么
  2. 修饰了 static var 的 property 初始化是否是线程安全,还是需要用 static let

在 Swift 中的 static 究竟是什么

我们经常看到有的 Swift 中有的 propertyfunc 会用 static 修饰,他们其实有个官方的叫法是 Type PropertyType func。字面上理解就是属于 Type 的属性和方法(Swift 中 class 和 struct 都属于 Type)。

You can also define properties that belong to the type itself, not to any one instance of that type.
-- by apple document

那么 Type PropertyInstance Property 究竟有什么区别呢?看看官方文档的解释

Instance properties are properties that belong to an instance of a particular type. Every time you create a new instance of that type, it has its own set of property values, separate from any other instance.

意思就是 Instance properties 是和具体的实例相关的,你创建了多少个实例就会有多少个不同的 properties.而 Type Property 就不一样了,他是 one copy 的,简单理解就是只会有一份内存拷贝,在类型之间是共享的。另外有个特性就是惰性赋值,在第一次被访问的时候才会初始化。

修饰了 static var 的 property 初始化是否是线程安全,还是需要用 static let

结论很简单,他们初始化都是线程安全的,因为上面的提到的修饰 static 的 Property 都是 one copy 的。 不信看代码:我们看到堆栈里面有个 swift_once 的方法,他保证了我们的 Type Property 不管是用 let 还是 var 修饰的都只会被初始化一次。

总结

  1. 被 static 修饰的 property 叫做 Type Property(也叫 Stored type properties)
  2. 不管用 let 还是 var 修饰的 Type Property 初始化都是线程安全的。修饰了 static 的 property(Type Property)都会调用 swift_once 函数,确保只初始化一次(文档里叫 one copy)。

参考文档:docs.swift.org/swift-book/…