«Не удается использовать изменяющий метод get для неизменного значения:« self »является неизменным» при итерации? - PullRequest
0 голосов
/ 20 марта 2020

Кто-нибудь знает, почему self.indexCount в ForEach дает ошибку Cannot use mutating getter on immutable value: 'self' is immutable? Я могу предоставить aView с indexCount, но это не очень удобно. Я не меняю indexCount. Это ошибка SwiftUI или намеренная?

struct aView: View {
    let array: [[String]]
    lazy var indexCount: Int = array[0].count

    var body: some View {
        VStack {
            ForEach(0..<self.indexCount, id: \.self) { index in
                Text("Hello World")
           }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Это намеренно. В SwiftUI могут изменяться только переменные @State. Вы не можете использовать lazy var, как это. Замените его вычисляемым свойством:

var indexCount : Int { array[0].count }

В любом случае это лучше, потому что оно всегда будет правильным: indexCount всегда будет текущим размером array[0]), тогда как ваш способ, значение будет зависать при любом count первом первом *1014* времени его получения.

0 голосов
/ 20 марта 2020

lazy всегда приводит к мутации при инициализации значения. Следовательно, вы не можете использовать его в не мутирующем контексте.

body не mutating, поэтому вы не сможете использовать lazy там. Вы получаете ту же ошибку с этим минимальным примером:

struct LazyUser {
    lazy var something: Bool = { false } ()
}

func useSomething() {
    let notOk = LazyUser()
    var ok = LazyUser()
    _ = notOk.something // ERROR: Cannot use mutating getter on immutable value: 'notOk' is a 'let' constant
    _ = ok.something
}

На форумах Swift есть ветка об этом] https://forums.swift.org/t/allow-lazy-vars-on-immutable-structs/16417)

...