我试图使用@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
。