首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 4,keyPath get错误:无法分配给类型为'Any‘的不可变表达式

Swift 4,keyPath get错误:无法分配给类型为'Any‘的不可变表达式
EN

Stack Overflow用户
提问于 2017-09-07 19:58:28
回答 2查看 1.6K关注 0票数 3
代码语言:javascript
复制
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的人。获取错误:不能赋值给'Any‘类型的不可变表达式

我不明白为什么?

代码语言:javascript
复制
c[keyPath: cks[0] as! WritableKeyPath<Contact, Int>] = p[keyPath: pks[0]] as! Int 

都会起作用的。bug我怎么能这样做:

代码语言:javascript
复制
pks.indices.forEach { index in
    let pk = pks[index]
    let ck = cks[index]
    c[keyPath: ck] = p[keyPath: pk]
}
EN

回答 2

Stack Overflow用户

发布于 2017-09-08 15:56:57

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

代码语言:javascript
复制
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>]

从理论上讲,这是可行的:

代码语言:javascript
复制
let person = Person()
person[keyPath:strings[0]] = strings[1]
票数 2
EN

Stack Overflow用户

发布于 2018-03-21 20:44:30

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46095758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档