将SwiftUI与@AppStorage一起使用,并动态调用函数



我试图使用@AppStorage读取/保存值并用它计算一些东西,但我未能调用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创建新类的情况下,是否有任何更改可以使其工作?AppStorage已经解决了每次UI更改时更新UI的问题。我认为,作为一种变通方法,理论上我可以预先计算我想要的函数,比如存储它和源值,但这没有任何意义。

由于不同国家的小数格式不同(例如,有些国家使用逗号作为小数点(,因此您必须使用格式化程序,并且为此提供了一种新的方便API:

Text(powerized(x: sourcePower), format: .number)

这样,如果区域设置发生更改,标签也将自动更新。

它与@AppStorage无关。您的powerized函数返回一个小数,而您正试图在Text()中使用is。CCD_ 12需要一个CCD_。你可以做:

var body: some View {
VStack {
// Use .description which returns a String
Text(powerized(x: sourcePower).description)
}
}

这两者中的任何一个都将使其成为String

最新更新