【问题标题】:setting computed property in a SwiftUI view doesn't compile在 SwiftUI 视图中设置计算属性无法编译
【发布时间】:2020-06-12 13:39:45
【问题描述】:

尝试在 SwiftUI 视图中设置计算属性 s 会导致编译器错误“无法分配给属性:'self' 是不可变的”。
我该如何调用 setter?

struct Test: View{
  @State var _s = "test"
  @State var _s2 = true
  private var s : String
  { get { _s }
    set (new)
    { _s = "no test"
      _s2 = false
      // do something else
    }
  }

  var body: some View
  { Text("\(s)")
    .onTapGesture {
      self.s = "anyting"  // compiler error
    }
  }
}

【问题讨论】:

  • 您实际上是在尝试复制 @State 行为...为什么?视图是结构,值,它不能从内部修改自己,这就是为什么有@State - 它是为了你尝试做的事情。就用它吧。
  • @Asperi 我想在设置s的时候改变一些其他的状态,我会扩展例子

标签: swift swiftui computed-properties


【解决方案1】:

啊哈……我明白了。只需使用非变异集

  private var s : String
  { get { _s }
    nonmutating set (new)
    { _s = "no test"
      _s2 = false
      // do something else
    }
  }

【讨论】:

    【解决方案2】:

    也就是说,为什么您的视图中已经有了 @State 属性包装器。

    struct Test: View{
      @State var s = "test"
        var body: some View {
        Text("\(s)")
        .onTapGesture {
          self.s = "anyting"  // compiler error
        }
      }
    }
    

    您可以直接从代码中更改 s,因为 s 用 @State 包装。

    这与上面的功能等效

    struct Test: View{
        let s = State<String>(initialValue: "alfa")
        var body: some View {
            VStack {
                Text("\(s.wrappedValue)")
                    .onTapGesture {
                        self.s.wrappedValue = "beta"
                }
            }
        }
    }
    

    或者如果需要绑定

    struct Test: View{
        let s = State<String>(initialValue: "alfa")
        var body: some View {
            VStack {
                TextField("label", text: s.projectedValue)
            }
        }
    }
    

    【讨论】:

    • 我想在设置s的时候改变一些其他的状态,我会扩展例子
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多