Swift #Predicate Macro使用单组件KeyPath时运行崩溃问题
使用
#Predicate宏创建单组件KeyPath谓词时运行崩溃的问题 问题重现
以下代码编译正常,但运行时会崩溃:
final class Foo { var title: String = "" var name: String = "" } let p = #Predicate<Foo> { $0.title == "test" }
崩溃错误信息:
Foundation/KeyPath+Inspection.swift:65: Fatal error: Predicate does not support keypaths with multiple components
通过Xcode展开宏可见,代码被转换为单组件KeyPath的合法调用:
Foundation.Predicate<Foo>({ PredicateExpressions.build_Equal( lhs: PredicateExpressions.build_KeyPath( root: PredicateExpressions.build_Arg($0), keyPath: \.title ), rhs: PredicateExpressions.build_Arg("test") ) })
原因分析
Foundation内部用于检查KeyPath组件数量的逻辑存在缺陷:它依赖offset(of:)方法判断存储属性的KeyPath是否为多组件,但这个判断方式并不可靠,导致单组件KeyPath被误判为多组件,进而触发崩溃。
现状说明
苹果官方已确认该问题并正在推进修复工作。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

