代码之家  ›  专栏  ›  技术社区  ›  mica

在SwiftUI视图中设置computed属性不会编译

  •  0
  • mica  · 技术社区  · 5 年前

    试图在SwiftUI视图中设置计算属性s时,编译器出现错误“无法分配给属性:'self'是不可变的”。
    我该怎么打给二传手?

    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
        }
      }
    }
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   Asperi    5 年前

    啊哈。。。我懂了。只需使用非变异集

      private var s : String
      { get { _s }
        nonmutating set (new)
        { _s = "no test"
          _s2 = false
          // do something else
        }
      }
    
        2
  •  1
  •   user3441734    5 年前

    这就是为什么视图中已经有@State property包装器。

    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)
            }
        }
    }