SwiftUI-重写 View的构造器,如何给@Binding属性赋值

209 阅读1分钟

示例代码

struct ConstructorView: View {
  @Binding var isShow: Bool
  var body: some View {
    Text(/@START_MENU_TOKEN@/"Hello, World!"/@END_MENU_TOKEN@/)
  }
}

问题

有些情况下,需要在View的构造器下,初始化一些数据。

这时候需要重写一下构造器

由于@Binding属性的存在,让重写构造器变得不那么简单

// 编译器提示的
  init(isShow: Bool) {
    self.isShow = isShow
  }
 
 // 可能你会想当然赋值的。 但是$ 所引用的projectedValue是只读的
  init(isShow: Binding<Bool>) {
    self.$isShow = isShow
  }

解决

// 下划线赋值即可解决
init(isShow: Binding<Bool>) {
    _isShow = isShow
}

分析

暂时还没想到

  init(isShow: Binding<Bool>) {
    _isShow = isShow
    let a = _isShow // Binding<Bool> 类型
    let b = self.isShow // Bool类型
    let c = self.$isShow // Binding<Bool> 类型
  }

目前能想到的时候,_isShow直接访问属性,没有通过属性set方法进行访问。