Параметр выбора SwiftUI Picker выдает ошибку «Тип выражения ‘Привязка’ неоднозначен без дополнительного контекста»

#binding #swiftui #optional-chaining

#привязка #swiftui #необязательно-цепочка

Вопрос:

Я получаю ошибку типа выражения ‘Привязка<_>’ неоднозначна без дополнительного контекста в $order.quantity.contracts в следующем коде:

 struct ContractsPickerView: View {
    @Binding var order: Order
    
    var question: String
            
    var body: some View {
                         
                        Error
                          |
                          |
                          V                
        Picker(selection: $order.quantity.contracts, label: Text("(question)").font(.headline)) { 
            ForEach(0..<101, id: .self) { contracts in
                Text("(contracts)")
            }
        }
    }
}
  

На самом деле, Xcode не предлагает мне contracts атрибут в Quantity классе после ввода $order.quantity. . Вот модели:

 struct Order {
    var quantity: Quantity?
}

struct Quantity: Hashable {
    private var userEnteredContracts: Int?
    var contracts: Int {
        get {
            return userEnteredContracts
        }
        set(newContracts) {
            userEnteredContracts = newContracts
        }
    }
}
  

Кто-нибудь может объяснить проблему и предложить решение, пожалуйста?

Комментарии:

1. Как вы объявили order , на ваш взгляд?

2. @pawello2222 — просто обновил вопрос, чтобы показать, как был объявлен порядок.

3. Это потому, что quantity может быть равно нулю. Итак, на самом деле вы пытаетесь сделать $order.quantity?.contracts то, что не разрешено. Как должно вести себя ваше приложение, если quality равно нулю? Также ваш код не будет компилироваться: contracts имеют тип Int , но вы возвращаете, userEnteredContracts которые имеют тип Int? .

4. Спасибо, @pawello2222! Я предполагал, что Swift развернется quantity? но, очевидно, я ошибся! И да, спасибо, что указали, что contracts и userEnteredContracts тип данных должны совпадать. Я обновил Order модель таким образом, что var quantity: Quantity и Quantity модель таким образом, что var contracts: Int? . Не стесняйтесь публиковать ответ, чтобы вы могли получить оценку. В противном случае, я также рад ответить на вопрос. Спасибо за вашу помощь!

Ответ №1:

Для вашей привязки к работе quantity не может быть нулевым.

На самом деле вместо:

 $order.quantity.contracts
  

ты пытаешься сделать

 $order.quantity?.contracts
  

что недопустимо. Как должен вести себя ваш средство выбора, если quantity равно нулю?

Решением может быть сделать quantity необязательный:

 struct Order {
    var quantity: Quantity
}
  

Также обратите внимание, что ваш код не будет компилироваться: contracts имеют тип Int , но вы возвращаете userEnteredContracts те, которые имеют тип Int?

Возможно, вы захотите сделать contracts необязательным:

 struct Quantity: Hashable {
    private var userEnteredContracts: Int?
    var contracts: Int? {
        get {
            return userEnteredContracts
        }
        set(newContracts) {
            userEnteredContracts = newContracts
        }
    }
}
  

или укажите значение по умолчанию:

 struct Quantity: Hashable {
    private var userEnteredContracts: Int?
    var contracts: Int {
        get {
            return userEnteredContracts ?? 0
        }
        set(newContracts) {
            userEnteredContracts = newContracts
        }
    }
}
  

Комментарии:

1. Кроме того, при использовании средства выбора мне нужно было изменить содержимое в ForEach цикле с Text("(contracts)") на Text(String(contracts)).tag(contracts as Int?) .