将 SwiftUI 与 @AppStorage 和即时函数调用一起使用
Using SwiftUI with @AppStorage and on-the-fly function call
我正在尝试使用 @AppStorage
到 read/save 一个值并用它计算一些东西,但是我无法在我的 ContentView
中调用函数。示例:
Helper.swift
func powerized(x: Decimal) -> Decimal {
let powerized: Decimal = pow(x, 3) * 6.25
return powerized
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@AppStorage(StorageKeys.sourcePower.rawValue) var sourcePower = 15
var body: some View {
VStack {
Text(powerized(x: sourcePower))
}
}
}
通过这个实现,我得到 Initializer 'init(_:)' requires that 'Decimal' conform to 'StringProtocol'
。
如果我放一个
var myValue: Decimal = powerized(x: sourcePower)
Text(myValue)
我收到转换错误 Cannot convert value of type 'Int' to expected argument type 'Decimal'
。这可能是因为变量未定义为 Decimal
但即使进行了更改我也会得到
Cannot use instance member 'age' within property initializer; property initializers run before 'self' is available
.
我对此非常生气。在不使用 ObservableObject
创建新的 class 的情况下,是否有任何更改可以使其正常工作? AppStorage
已经解决了每次更改时更新 UI 的问题。
我认为,作为一种解决方法,理论上我可以预先计算我想要的函数作为存储它以及源值,但这没有任何意义。
与@AppStorage
无关。你的 powerized
函数 returns 是一个小数,而你正试图使用的是 Text()
中的一个。 Text()
需要 String
。你可以这样做:
var body: some View {
VStack {
// Use .description which returns a String
Text(powerized(x: sourcePower).description)
}
}
其中任何一个都会使它成为 String
。
因为不同国家/地区的小数格式不同(例如,有些国家/地区使用逗号作为小数点),您必须使用格式化程序,并且有一个新的便利 API:
Text(powerized(x: sourcePower), format: .number)
这样,如果区域设置发生变化,标签也会自动更新。
我正在尝试使用 @AppStorage
到 read/save 一个值并用它计算一些东西,但是我无法在我的 ContentView
中调用函数。示例:
Helper.swift
func powerized(x: Decimal) -> Decimal {
let powerized: Decimal = pow(x, 3) * 6.25
return powerized
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@AppStorage(StorageKeys.sourcePower.rawValue) var sourcePower = 15
var body: some View {
VStack {
Text(powerized(x: sourcePower))
}
}
}
通过这个实现,我得到 Initializer 'init(_:)' requires that 'Decimal' conform to 'StringProtocol'
。
如果我放一个
var myValue: Decimal = powerized(x: sourcePower)
Text(myValue)
我收到转换错误 Cannot convert value of type 'Int' to expected argument type 'Decimal'
。这可能是因为变量未定义为 Decimal
但即使进行了更改我也会得到
Cannot use instance member 'age' within property initializer; property initializers run before 'self' is available
.
我对此非常生气。在不使用 ObservableObject
创建新的 class 的情况下,是否有任何更改可以使其正常工作? AppStorage
已经解决了每次更改时更新 UI 的问题。
我认为,作为一种解决方法,理论上我可以预先计算我想要的函数作为存储它以及源值,但这没有任何意义。
与@AppStorage
无关。你的 powerized
函数 returns 是一个小数,而你正试图使用的是 Text()
中的一个。 Text()
需要 String
。你可以这样做:
var body: some View {
VStack {
// Use .description which returns a String
Text(powerized(x: sourcePower).description)
}
}
其中任何一个都会使它成为 String
。
因为不同国家/地区的小数格式不同(例如,有些国家/地区使用逗号作为小数点),您必须使用格式化程序,并且有一个新的便利 API:
Text(powerized(x: sourcePower), format: .number)
这样,如果区域设置发生变化,标签也会自动更新。