问题

最近在写 SwiftUI 的时候遇到了一件怪事。

struct AView: View {
    @State private var content: String
    var body: some View {
        Text(content)
    }
}
#Preview {
    AView(content: "Test")
}

上面的代码没有问题,参数能够传递给 AView@state 标记的参数 content

紧接着咱们把 conten 变成 optional,成果还是相同契合预期。

struct AView: View {
    @State private var content: String?
    var body: some View {
        Text(content ? "")
    }    
}
#Preview {
    AView(content: "Test")
}

不过当咱们给 View 添加初始化办法后,奇怪的事情就开端出现了。外面的参数无法传递给 conten 了,最终 Aview 展现了空字符串。 打断点看了一下,参数的确传递进去了,但走到 body 办法内部时,content 是空的(类型是State<Optional<String>>, _value = nil)。

struct AView: View {
    @State private var content: String?
    var body: some View {
        Text(content ? "")
    }
    init(content: String) {
        self.content = content
    }
}
#Preview {
    AView(content: "Test")
}

网上查了一下,发现假如给 Viewinit 办法,需要用特别的办法给 State 属性赋值。

init(content: String) {
    _content = State(initialValue: content)
}

我理解被 @State 包装的属性类型现已变了(State<Type>)。咱们在 View 的上下文中能够直接修正它,但是在初始化办法中不可。

不过当咱们把 contentoptional 改成 非 optional 时,状况又变了。不需要运用特别的办法,值相同能够经过 init 办法传递给 content 。。。

struct AView: View {
    @State private var content: String
    var body: some View {
        Text(content)
    }
    init(content: String) {
        self.content = content
    }
}
#Preview {
    AView(content: "Test")
}

定论

一般咱们不会主动去写 Viewinit 办法,不过当参数比较多且不是必要参数时,咱们可能会重写 init 办法给参数默认值,以简化初始化办法。假如在之后的开发者遇到了参数无法传递问题,能够测验运用 State结构办法来赋值。