You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:如何将CNContact的数组类型KeyPath转为KeyPath<CNContact, Any>

解决KeyPath存入Array<KeyPath<CNContact, Any>>的问题

Swift中,KeyPath<Root, Value>可以向上转换为KeyPath<Root, Any>,但不能直接赋值或用as!强制转换,正确方式是使用**类型转换操作符as**完成安全转换:

let keyPath = \CNContact.phoneNumbers as KeyPath<CNContact, Any>
let keyPaths: [KeyPath<CNContact, Any>] = [keyPath]

也可以直接在数组中完成转换:

let keyPaths: [KeyPath<CNContact, Any>] = [
    \CNContact.phoneNumbers as KeyPath<CNContact, Any>,
    \CNContact.givenName as KeyPath<CNContact, Any>
]

为什么之前的方式失效?

  • 直接赋值let keyPath0: KeyPath<CNContact,Any> = \CNContact.phoneNumbers失败,因为编译器无法自动将具体类型的KeyPath隐式转换为Any类型的KeyPath,必须显式声明转换。
  • 使用as!强制转换会触发警告,因为Swift类型系统将这两种KeyPath视为无关类型,强制转换必然失败,运行时会直接崩溃。

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:28