肇鑫的技术博客

业精于勤,荒于嬉

@State在初始化函数中的特殊性

原来Swift的Sheet里还不能这么做中,提到也可以使用初始化函数。但是我在修改使用为初始化函数之后,代码运行却不符合预期。于是我询问AI:

使用初始化函数的方式之后,始终显示的是xtTransUnits.isEmpty == true的分支,这是为什么呢?

#AI回答
问题出在初始化器的实现方式上。当前的实现使用了立即执行的闭包来设置 xtTransUnits,但因为 @State 属性在初始化器中的特殊性,这种方式并不会正确地设置初始值。

修改建议如下:

struct AITranslationView: View {
    // ... 其他属性 ...
    
    init(trees: [Tree<IDTree>]) {
        self.trees = trees
        let allUnits = Xliff_Tool.getXTTransUnits(from: trees)
        _xtTransUnits = State(initialValue: allUnits.filter { $0.target == nil || $0.target?.isEmpty == true })
    }
}

关键修改点:

  1. 使用 _xtTransUnits = State(initialValue: ...) 来正确初始化 @State 属性
  2. 移除了立即执行闭包,改为直接赋值
  3. 保持过滤逻辑不变

这样修改后,xtTransUnits 将被正确初始化,视图也会显示正确的分支。