Swift中一次性初始化的参数名称及线程安全性咨询
问题解答
一、这类属性的名称
你代码里的这种定义方式,在Swift里叫做使用立即执行闭包初始化的存储属性(也常简称为闭包初始化存储属性)。它通过一个立即执行的闭包({ ... }())完成属性的初始化逻辑,加上let修饰符的限制,整个初始化过程只会执行一次,属性值在初始化完成后就不可修改。
二、线程安全性分析
假设属性的类型(比如示例中的DateFormatter)本身具备线程安全性,这类属性的线程安全可以从两个阶段判断:
- 初始化阶段:闭包的执行绑定在实例创建的线程中,Swift会保证
let修饰的存储属性仅被初始化一次,不会出现多线程同时触发闭包执行的情况,因此初始化过程是线程安全的。 - 访问阶段:因为
let属性初始化完成后值就固定不变,再结合类型本身的线程安全性,多线程环境下读取或使用该属性的实例,不会产生线程安全问题。
补充:如果是
lazy var修饰的同类闭包初始化属性,线程安全性逻辑会有所不同,但你这里使用let,不存在延迟初始化的场景,无需担心重复初始化的问题。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

