Как привязать к значению, хранящемуся в массиве или словаре? Xcode сообщает о странных / неточных ошибках - PullRequest
0 голосов
/ 29 мая 2020

Может ли кто-нибудь объяснить, почему это запрещено ...

Учитывая следующий класс:

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'

Это связано с:

  1. ошибка в моем code?
  2. языковое ограничение (привязка к объектам, хранящимся в массивах, не разрешена)?
  3. Что-то еще (например, я держу его неправильно)?

Если причина 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)
    }

Но это кажется например, слишком много кода, чтобы просто ссылаться на значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...