继承Swift Package自定义类后AppDelegate常量为何为空?
问题原因解析
这跟苹果对Swift Package的内存分配机制无关,核心是跨模块类的初始化时机差异,具体细节如下:
- 先明确两个关键字的本质区别:
let定义的存储属性必须在类实例的初始化阶段完成赋值;而lazy var定义的属性,赋值逻辑会延迟到该属性第一次被访问时才执行。 - 当
AppDelegate继承Swift Package中的CustomSwiftPackageDelegate时,UIKit会在App启动阶段自动实例化AppDelegate。这个过程中,主App模块的初始化优先级高于Swift Package模块,导致父类(位于Package中)的let属性在实例化时,所在模块的静态初始化流程还没完全走完,属性没有被正确赋值,所以控制台打印为空。 - 改成
lazy var后,属性的赋值逻辑被延迟到第一次访问时执行,此时Swift Package模块已经完成初始化,自然能拿到正确的"test"值。 - 而当父类与
AppDelegate在同一模块,或者直接继承系统自带的UIResponder/UIApplicationDelegate时,不存在跨模块的初始化顺序冲突,let属性能在实例化阶段正常完成赋值,所以打印结果正常。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

