Компилятор не может проверить это выражение в течение разумного времени в SwiftUI - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь создать простую форму в SwiftUI, но получаю сообщение об ошибке «Компилятор не может проверить тип этого выражения;попробуйте разбить выражение на отдельные подразделы »в представлении, возвращаемом из тела (в данном случае Form, но я также пробовал VStack). Если я начну удалять некоторые из подпредставлений, они, похоже, разрешатся, хотя ни одно из моих представлений не возвращает 10 подпредставлений напрямую, что, я считаю, является пределом для одного представления (за исключением представлений, возвращаемых в ForEach).

import SwiftUI

struct CreateDispatchView: View {
    @State private var customerId: Int = 0
    @State private var name: String = ""
    @State private var phone: String = ""
    @State private var description: String = ""
    @State private var priorityId: Int = 0
    @State private var callTypeId: Int = 0
    @State private var bay: String = ""
    @State private var poTicket: String = ""
    @State private var outOfChemicals: Bool = false
    @State private var isReturnCall: Bool = false

    var body: some View {
        Form { // <-- Error is shown here
            Section {
                Picker("Customer", selection: $customerId) {
                    ForEach(0 ..< 10) {
                        Text("Customer \($0)")
                    }
                }
                TextField("Name", text: $name)
                TextField("Phone", text: $phone)
                TextField("Description", text: $description)
                TextField("Bay", text: $bay)
                TextField("PO ticket", text: $poTicket)
            }

            Section {

                Picker("Priority", selection: $priorityId) {
                    ForEach(0 ..< 2) {
                        Text("Priority \($0)")
                    }
                }
                Picker("Call type", selection: $callTypeId) {
                    ForEach(0 ..< 3) {
                        Text("Call type \($0)")
                    }
                }
            }

            Section {

                Toggle(isOn: $outOfChemicals) {
                    Text("Out of chemicals")
                }
                Toggle(isOn: $isReturnCall) {
                    Text("Is return call")
                }
            }
        }
    }
}

struct CreateDispatchView_Previews: PreviewProvider {
    static var previews: some View {
        CreateDispatchView()
    }
}




1 Ответ

1 голос
/ 17 октября 2019

Обработка больших вложенных выражений ViewBuilder является слабым местом в текущем быстром компиляторе. В целом, однако, совет «попытаться разбить выражение на отдельные подразделы» является хорошим: рефакторинг этих монолитных выражений ViewBuilder в отдельные динамические переменные - это хороший способ повысить производительность (плюс он помогает в выделении реальныхошибки).

Вот пример того, как вы можете изменить свой код для успешной компиляции:

struct CreateDispatchView: View {
    @State private var customerId: Int = 0
    @State private var name: String = ""
    @State private var phone: String = ""
    @State private var description: String = ""
    @State private var priorityId: Int = 0
    @State private var callTypeId: Int = 0
    @State private var bay: String = ""
    @State private var poTicket: String = ""
    @State private var outOfChemicals: Bool = false
    @State private var isReturnCall: Bool = false

    var body: some View {
        Form {
            customerSection
            prioritySection
            infoSection
        }
    }

    private var customerSection: some View {
        Section {
            Picker("Customer", selection: $customerId) {
                ForEach(0 ..< 10) {
                    Text("Customer \($0)")
                }
            }
            TextField("Name", text: $name)
            TextField("Phone", text: $phone)
            TextField("Description", text: $description)
            TextField("Bay", text: $bay)
            TextField("PO ticket", text: $poTicket)
        }
    }

    private var prioritySection: some View {
        Section {
            Picker("Priority", selection: $priorityId) {
                ForEach(0 ..< 2) {
                    Text("Priority \($0)")
                }
            }
            Picker("Call type", selection: $callTypeId) {
                ForEach(0 ..< 3) {
                    Text("Call type \($0)")
                }
            }
        }
    }

    private var infoSection: some View {
        Section {
            Toggle(isOn: $outOfChemicals) {
                Text("Out of chemicals")
            }
            Toggle(isOn: $isReturnCall) {
                Text("Is return call")
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...