Swift 4,keyPath get error:无法分配给'Any'类型的不可变表达式

时间:2017-09-07 11:58:28

标签: swift4

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]]

我希望将联系人的值复制到Person使用swift 4 keyPath。得到一个     错误:无法分配给“Any”

类型的不可变表达式

我不明白为什么?

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

会奏效。我怎么能这样做:

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

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但问题似乎是当你混合时它无法推断可写类型:

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>]

理论上这可行:

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

答案 1 :(得分:1)

似乎没有办法在动态类型上使用Swift 4 KeyPath功能。编译器需要能够在编译时推断类型,而不是运行时。您收到的错误只是告诉您 - 编译器无法推断值类型,因此无法保证值可以更改。