3 votes

Swift 4, keyPath get error : cannot assign to immutable expression of type 'Any' (erreur d'affectation à une expression immuable de type 'Any')

public struct Person {
    var fid: Int
    var name: String
}

public struct Contact {
    var fid: Int
    var name: String
}

var pks = [\Person.fid, \Person.name]
var cks = [\Contact.fid, \Contact.name]
var p = Person(fid: 10, name: "hello")
var c = Contact(fid: 11, name: "test")

c[keyPath: cks[0]] = p[keyPath: pks[0]]

Je veux copier les valeurs du contact vers la personne en utilisant swift 4 keyPath. J'obtiens une error : cannot assign to immutable expression of type 'Any' (erreur : ne peut pas assigner à une expression immuable de type 'Any')

Je ne comprends pas pourquoi ?

c[keyPath: cks[0] as! WritableKeyPath<Contact, Int>] = p[keyPath: pks[0]] as! Int 

fonctionnera. bug comment puis-je faire comme ça :

pks.indices.forEach { index in
    let pk = pks[index]
    let ck = cks[index]
    c[keyPath: ck] = p[keyPath: pk]
}

2voto

Je rencontre le même problème, mais il semble qu'il ne puisse pas déduire les types inscriptibles lorsque vous les mélangez :

var mixed = [\Person.fid, \Person.name]            // [PartialKeyPath<Person>]
var ids = [\Person.fid, \Person.sid]               // [ReferenceWriteableKeyPath<Person, Int]
var mixedIds = [\Person.fid, \Contact.fid]         // [AnyKeyPath]
var strings = [\Person.firstName, \Person.surname] // [ReferenceWriteableKeyPath<Person, String>]

En théorie, cela pourrait fonctionner :

let person = Person()
person[keyPath:strings[0]] = strings[1]

1voto

Halyna Rubashko Points 467

Il semble qu'il n'y ait aucun moyen d'utiliser la fonctionnalité KeyPath de Swift 4 sur les types dynamiques. Le compilateur doit être capable de déduire les types au moment de la compilation, et non de l'exécution. L'erreur que vous recevez vous indique justement que le compilateur ne peut pas déduire le type de valeur et ne peut donc pas garantir que la valeur peut être modifiée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X