Ios SwiftUI-使用var或let从两个文本字段添加值

Ios SwiftUI-使用var或let从两个文本字段添加值,ios,swift,swiftui,textfield,Ios,Swift,Swiftui,Textfield,如何在SwiftUI中添加两个文本字段的值 我有以下代码: import SwiftUI struct ContentView: View { @State private var value1 = "" @State private var value2 = "" private var sumValues = (Int(value1) ?? 0) + (Int(value2) ?? 0)

如何在SwiftUI中添加两个文本字段的值

我有以下代码:

import SwiftUI

struct ContentView: View {
    
    @State private var value1 = ""
    @State private var value2 = ""
    
    private var sumValues = (Int(value1) ?? 0) + (Int(value2) ?? 0)
    
    var body: some View {
        VStack {
            TextField("type value 1 here", text: $value1)
                .keyboardType(.numberPad)
            
            TextField("type value 2 here", text: $value2)
                .keyboardType(.numberPad)
            
            Text("sum: \(sumValues)")
            
            // I need to have a var or let, so I cannot use something like this:
            //Text("sum: \((Int(value1) ?? 0) + (Int(value2) ?? 0))")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
我在与private var sumValues的连线中发现此错误…

无法在属性初始值设定项中使用实例成员“value1”; 属性初始值设定项在“self”可用之前运行

无法在属性初始值设定项中使用实例成员“value2”; 属性初始值设定项在“self”可用之前运行


我认为您可以将
sumValues
更改为计算属性:

private var sumValues: Int {
        get {
            (Int(value1) ?? 0) + (Int(value2) ?? 0)
        }
}

使用
计算属性

private var sumValues: Int { (Int(value1) ?? 0) + (Int(value2) ?? 0) }

可能的方法是将所有这些逻辑(也可能是所有其他逻辑)移动到视图模型中,如下所示-因此保持引擎与视图分离,并让标准的观察动态属性负责视图更新:

这是一个简单的演示。使用Xcode 12/iOS 14进行测试

class CalcViewModel: ObservableObject {
    @Published var value1 = "" {
        didSet { update() }
    }
    @Published var value2 = "" {
        didSet { update() }
    }
    @Published var sum: Int = 0

    private func update() {
        self.sum = (Int(value1) ?? 0) + (Int(value2) ?? 0)
    }
}

struct ContentView: View {
    @ObservedObject var vm = CalcViewModel()

    var body: some View {
        VStack {
            TextField("type value 1 here", text: $vm.value1)
                .keyboardType(.numberPad)

            TextField("type value 2 here", text: $vm.value2)
                .keyboardType(.numberPad)

            Text("sum: \(vm.sum)")
        }
    }
}

这是行不通的。尝试为一个字段设置一个值,然后将其删除,然后再次添加(
+=
将每次执行->
总和
将永远不会被清除)。确定。。其目的是显示唯一的方法。。。并更正为计算器。谢谢@pawello2222。你实际上不需要
get
-看看@Frankenstein的答案。@pawello2222这个答案也正确吗?我在某个地方读到,当我们只使用get而不使用set时,我们不需要编写get。但这不是一个有效的答案吗?因为我已经测试过了,而且它是有效的。@mallow是的,它是有效的(我也投了更高的票)。现在被接受的解决方案只是更干净而已。