从ObservableObject转@Observable宏:类初始值初始化失败问题
解决@Observable宏初始化属性的问题
针对将视图模型从ObservableObject迁移到@Observable宏时,出现的属性必须有初始值但自定义初始化方法无效的问题,以下是几种实用解决方案:
- 使用隐式解包可选类型:如果能确保
foo在初始化后绝不会为nil,这种方式可以避免提供无意义的默认值,同时满足宏的要求:
@Observable final class ViewModel { var foo: Foo! init(foo: Foo) { self.foo = foo } }
- 提供默认初始值后在init中覆盖:若
Foo具备无参初始化器,可先给属性设置一个默认实例,再在自定义初始化方法中替换为传入的实例。虽然看起来是两次赋值,但Swift编译期会优化该过程,不会产生额外性能开销:
@Observable final class ViewModel { var foo: Foo = Foo() init(foo: Foo) { self.foo = foo } }
- 使用可选类型(允许nil的场景):如果业务逻辑允许
foo为nil,直接将属性声明为可选类型即可,无需额外初始值:
@Observable final class ViewModel { var foo: Foo? init(foo: Foo) { self.foo = foo } }
- 私有存储属性+公开计算属性(特殊场景):如果不想使用可选类型或默认值,可通过这种方式封装,但会增加代码复杂度,仅推荐在特殊需求下使用:
@Observable final class ViewModel { private var _foo: Foo! var foo: Foo { get { _foo } set { _foo = newValue } } init(foo: Foo) { self._foo = foo } }
内容的提问来源于stack exchange,提问作者amq
相关产品推荐
相关产品推荐

