J'essaie de réutiliser un ancien morceau de code Swift, mais j'obtiens une erreur "Impossible d'utiliser le getter de mutation sur une valeur immuable:" auto "est une erreur immuable". Xcode voulait ajouter "mutation" avant le func, et a proposé de le faire par le biais d'un "correctif". L'erreur a donc disparu, mais reste au niveau des instructions "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
Cela n'a rien à voir avec SwiftUI
. Il s'agit d'une conception Swift applique avec ses getters. Le principe est:
Les getters ne doivent pas muter l'objet. Parce que les développeurs ne s'y attendent peut-être pas. Ils ne devraient s'attendre à un changement que lorsque vous utilisez la fonction setter ou que vous appelez une fonction muting. Un getter n'est ni l'un ni l'autre.
L'exemple suivant fonctionne comme prévu:
struct Device {
var isOn = true
}
let x = Device()
let y = Device()
y.isOn // Doing such will not cause the object to mutate.
Pourtant, l'exemple suivant, le getter aura un effet secondaire. L'architecture Swift ne le permet tout simplement pas.
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.