#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?)
.