web-dev-qa-db-ja.com

不変の値に変更ゲッターを使用できません: 'self'は不変のエラーです

Swiftコードの古い部分を再利用しようとしていますが、「不変の値に変更ゲッターを使用できません: 'self' is immutable error '」というエラーが発生します。Xcodeは' mutating 'を追加しようとしましたfuncの前にあり、 'fix'を介してそうするように提案されているため、エラーはそこにありますが、 'Text'ステートメントに残っています。

import SwiftUI

struct ContentView: View {

     typealias PointTuple = (day: Double, mW: Double)
    let points: [PointTuple] = [(0.0, 31.98), (1.0, 31.89), (2.0, 31.77), (4.0, 31.58), (6.0, 31.46)]

    lazy var meanDays = points.reduce(0) { $0 + $1.0 } / Double(points.count)
    lazy var meanMW   = points.reduce(0) { $0 + $1.1 } / Double(points.count)

    lazy var a = points.reduce(0) { $0 + ($1.day - meanDays) * ($1.mW - meanMW) }
    lazy var b = points.reduce(0) { $0 + pow($1.day - meanDays, 2) }

    lazy var m = a / b
    lazy var c = meanMW - m * meanDays        
    lazy var x : Double = bG(day: 3.0)
    lazy var y : Double = bG(day: 5.0)
    lazy var z : Double = bG(day: 7.0)

    mutating func bG(day: Double) -> Double {
        return m * day + c
    }

    var body: some View {
        VStack {
            Text("\(x)")
            Text("\(y)")
            Text("\(z)")
        }
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif
5
arakweker

これはSwiftUIとは関係ありません。それはデザインについてですSwiftはそのゲッターを強制しています。原則は次のとおりです:

ゲッターはオブジェクトを変更してはなりません。開発者はそれを期待していない可能性があるためです。 setterを使用している場合、またはmutating関数を呼び出している場合にのみ、変更が期待されます。ゲッターはどちらでもありません。

次の例は期待どおりに動作します。

struct Device {
    var isOn = true
}

let x = Device()
let y = Device()

y.isOn // Doing such will not cause the object to mutate.

しかし、次の例では、ゲッターに副作用があります。 Swiftアーキテクチャはそれを許可していません。

struct Device2 {

    var x = 3
    var isOn: Bool {
        x = 5
        return true
    }
}

let a = Device2()
let b = Device2()

a.isOn // Doing such will mutate the object. a.x will be '5'. While `b.x` will be '3'. Swift doesn't want to allow this.
1
Honey