swift4 - Swift 4,keyPath 出现错误 : cannot assign to immutable expression of type 'Any'

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

我想使用 swift 4 keyPath 将 Contact 的值复制到 Person。得到一个 错误:无法分配给“任何”类型的不可变表达式

我不明白为什么?

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

最佳答案

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

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]

关于swift4 - Swift 4,keyPath 出现错误 : cannot assign to immutable expression of type 'Any' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46095758/

相关文章:

ios - 快速优雅地迭代 CoreData 关系?

swift - 如何在 Swift 中表达前向或后向范围?

ios - 选中时的 Tabman Image Tint 颜色

ios - 存储在用户默认值中的 Swift 4 键值字典

ios - 在 swift4 中将 JSONresponse 转换为 NSDATA 或 NSDICTIONARY

IOS Swift 如何突出显示选定的图像

ios - 无法加载 UITests 包,因为它已损坏或缺少必要的资源。尝试重新安装 bundle

swift - 遇到线程 1 : EXC_BAD_ACCESS (code=2) when using custom segue

swift - 如何使用 AlamoFire 搜索 JSON API 和解码数组

ios - 谁能告诉我如何去除 CarbonKit 中的深灰色底部边框