不能对不可变值使用变异 getter:'self' 是不可变的

Cannot use mutating getter on immutable value: 'self' is immutable

所以我一直在尝试解决这个已经在这里讨论过几次的问题,但我似乎无法真正理解问题的来源以及如何在我的应用程序中解决它。很抱歉,如果这个问题很明显,但我一周前就选择了 SwiftUI。

基本上我在这里做的是我有一个名为 countStrokes() 的函数,其中我有一个字符串数组作为输入。首先,我将数组转换为 int 数组,然后计算数组和 return 的总和作为 String。 之后,我声明了一个名为 strokes 的新惰性变量,并通过调用 countStrokes() 函数对其进行了初始化。 我想在 View 中做的就是使用 Text() 模块打印出笔画值。 任何关于如何修改我现有代码的想法都将不胜感激。

import SwiftUI

struct Skore: View {
    @State var skore: [String]

    lazy var strokes: String = countStrokes(array: skore)
    var body: some View {
        Text(strokes)
    }
}

func countStrokes(array: [String]) -> String {
    let newArray = array.compactMap{Int([=12=])}
    let total = newArray.reduce(0, +)
    let totalString = String(total)

    return totalString
}

你能做的是:

struct Skore: View {
@State var skore: [String]
@State var strokes: String = ""
var body: some View {
    Text(strokes).onAppear(perform: loadData)
}
func loadData() {
    self.strokes = countStrokes(array: skore)
}
}

func countStrokes(array: [String]) -> String {
let newArray = array.compactMap{Int([=10=])}
let total = newArray.reduce(0, +)
let totalString = String(total)
return totalString
}

struct ContentView: View {
@State var skore = ["1","2","3"]
var body: some View {
    Skore(skore: skore)
}
}

最简单的就是使用内联函数。一旦您的视图依赖于 skore 状态并且 countStrokes 依赖于它,一旦 skore 被修改,相应的 Text 将被重新计算并显示正确的结果。

struct Skore: View {
    @State var skore: [String]

    var body: some View {
        Text(countStrokes(array: skore))
    }
}