es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se escribe un KeyPath para referenciar el valor de un diccionario?

Digamos que tengo una estructura como esta:

struct Person {
  var kids: [KidId: KidName] = [:]
}

¿Es posible crear un keypath para hacer referencia al valor de algo en la propiedad User.kids? ¿Algo como \User.kids[KidId]?

Específicamente, me gustaría construir un WritableKeyPath. Pensé que se podía usar el keypath tanto en diccionarios como en arreglos, pero no puedo encontrar la sintaxis en ningún lugar de Internet. ¿Quizás no sea posible?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible construir un keypath para hacer referencia al valor de algo en la propiedad Person.kids usando la sintaxis \Person.kids[KidId]. Sin embargo, este keypath solo sería un KeyPath<person, kidname?=""> porque el valor de Person.kids[KidId] puede estar ausente si el KidId dado no está presente en el diccionario.

    Para crear un WritableKeyPath<person, kidname="">, puedes usar el método flatMap en el valor opcional KidName? devuelto por el keypath anterior para devolver un valor no opcional o nil si no hay valor presente. Aquí tienes un ejemplo de cómo podrías crear el keypath escribible:

    struct Person {
      var kids: [KidId: KidName] = [:]
    }
    
    let kidId = KidId(...)
    let nameKeyPath = \Person.kids[kidId].flatMap { $0 } // KeyPath<person, kidname="">?
    
    // Uso:
    let person = Person(kids: [kidId: "Johnny"])
    let oldValue = person[keyPath: nameKeyPath!] // "Johnny"
    person[keyPath: nameKeyPath!] = "Joey"
    let newValue = person[keyPath: nameKeyPath!] // "Joey"
    

    En el ejemplo anterior, el keypath nameKeyPath recorrerá el diccionario Person.kids para encontrar el valor para kidId. Si el valor está presente, flatMap devolverá un KeyPath<person, kidname=""> no opcional, que luego se puede utilizar para leer y escribir el valor asociado con esa clave en una instancia de Person.</person,></person,></person,></person,>

Comments are closed.