今天和群里小伙伴讨论到 static ,发现自己并没有特别了解 static 这个关键字。
- 在 Swift 中的
static究竟是什么 - 修饰了
static var的 property 初始化是否是线程安全,还是需要用static let
在 Swift 中的 static 究竟是什么
我们经常看到有的 Swift 中有的 property 和 func 会用 static 修饰,他们其实有个官方的叫法是 Type Property 和 Type 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 Property 和 Instance 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 修饰的都只会被初始化一次。
总结
- 被 static 修饰的 property 叫做
Type Property(也叫 Stored type properties) - 不管用 let 还是 var 修饰的
Type Property初始化都是线程安全的。修饰了 static 的 property(Type Property)都会调用 swift_once 函数,确保只初始化一次(文档里叫 one copy)。