Может ли кто-нибудь объяснить, почему это запрещено ...
Учитывая следующий класс:
class CandidateAttribute {
var attributeType : AttributeType
var name : String
var value = ""
init(attributeType: AttributeType) {
self.attributeType = attributeType
self.name = attributeType.wrappedName
self.value = ""
}
}
И класс, который имеет Dictionary
этих объектов:
class Wrapper {
var candidates : [String: CandidateAttribute]()
// other code
func getCandidateAttribute(attributeType: AttributeType) -> CandidateAttribute{
if let candidate = attributesDict[attributeType.wrappedName] {
return candidate
}
let newCandidate = CandidateAttribute(attributeType: attributeType)
attributesDict[attributeType.wrappedName] = newCandidate
return newCandidate
}
}
Почему я не могу выполнить привязку к CandidateAttribute.value
в следующем коде:
private func addAttributeRow(attributeType: AttributeType) -> some View {
let candidateAttr = candidateItem.getCandidateAttribute(attributeType: attributeType)
return HLabelTextField(label: candidateAttr.name,
hint: "Set value",
value: $candidateAttr.value) //candidateAttr.value)
}
С кодом
return HLabelTextField(label: candidateAttr.name,
hint: "Set value",
value: candidateAttr.value)
Я получаю сообщение об ошибке Cannot convert value of type 'String' to expected argument type 'Binding<String>'
С кодом:
return HLabelTextField(label: candidateAttr.name,
hint: "Set value",
value: $candidateAttr.value)
Я получаю сообщение об ошибке Use of unresolved identifier '$candidateAttr'
Это связано с:
- ошибка в моем code?
- языковое ограничение (привязка к объектам, хранящимся в массивах, не разрешена)?
- Что-то еще (например, я держу его неправильно)?
Если причина 2, мне кажется, что это довольно плохая языковая функция. Чем больше я использую SwiftUI, тем больше я нахожу, что он требует множества обходных решений, потому что вещи не «просто работают»
Примечание. Я также пробовал сделать CandidateAttribute
a struct
.. .
В качестве обходного пути я могу изменить CandidateAttribute
и добавить следующую функцию:
func getValueBinding() -> Binding<String> {
let binding = Binding<String>(get: { () -> String in
return self.value
}) { (newValue) in
// This func updates the database
self.value = newValue
}
return binding
}
и изменить код ссылки на:
private func addAttributeRow(attributeType: AttributeType) -> some View {
let candidateAttr = candidateItem.getCandidateAttribute(attributeType: attributeType)
return HLabelTextField(label: candidateAttr.name,
hint: "Set value",
value: candidateAttr.getValueBinding()) //candidateAttr.value)
}
Но это кажется например, слишком много кода, чтобы просто ссылаться на значение.