使用状态变量更新计算的属性

时间:2019-09-26 16:55:51

标签: swift swiftui

我有以下情况:我正在创建一个Form,用户可以在其中输入一个金额TextField。另外,用户可以通过Picker选择一种货币。金额用NumberFormatter设置格式,每当用户更改币种时,我都希望更新文本。

@State private var currencyCode = "EUR"

那是格式化程序:

private let currencyFormatter: NumberFormatter = {
    var formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.currencyCode = $currencyCode // something like this, but that's not working!
    return formatter
}()

表单如下:

Form {
    Section {
        TextField("Enter a description", text: $reason)
        TextField("Amount", value: $amount, formatter: currencyFormatter)
            .keyboardType(.decimalPad)
    }

    Section {
        Picker(selection: $currencyCode, label: Text("Currency")) {
            ForEach(codes, id: \.self) { code in
                Text(code)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您需要删除$$currencyCode给您一个Binding<String>,但是您需要值,而不是绑定到值。 (请参阅this answer,我将在其中解释绑定。)

第二,您要使用计算属性,因为数字格式器需要根据所选的currencyCode进行更改。将其放入您的视图结构中:

private var currencyFormatter: NumberFormatter {
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.currencyCode = currencyCode
    return formatter
}