将 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)

这样,如果区域设置发生变化,标签也会自动更新。