知识卡片

可失败构造函数把构造失败纳入类型系统

专业/工作 · 721.a

内容

参数不合法、外部资源缺失这类”实例根本不该被造出来”的情况,用 init? 声明的可失败构造函数处理:构造过程中一旦判定不满足条件就 return nil,调用方拿到的结果自然是 [[Optional 用类型系统表达”值可能不存在”]] 描述的那种可选类型,必须处理”可能没造出来”这个分支才能往下用。这比用一个全局校验函数在构造后单独判断、或者干脆放任非法状态的实例被创建出来,更早地把”这个数据合不合法”这件事焊死在构造这个唯一的入口上。值类型(结构体/枚举)可以在任意时刻触发失败;类因为要满足两段式构造的顺序,只能在所有属性都赋值完、且已经代理完父类构造之后才允许判定失败——这也是为什么例子里类的属性要临时声明成隐式解包的可选类型,先给个占位值满足初始化要求,再判断是否失败。

参考来源

《Swift全解析:新式iOS实战开发》第15章《Swift初始化》