如何为SwiftData的Predicate<each Input>添加带where子句的扩展方法
SwiftData Predicate 参数包扩展的正确实现方案
问题背景
SwiftData 中的 Predicate 类型采用参数包实现,定义为 struct Predicate<each Input>。需要为其添加一个静态方法 predicateMatchingNegativeSomeVars(),要求该方法仅在泛型参数为 SomeType(定义如下)时可用:
@Model class SomeType { var someVar: Int init(someVar: Int) { self.someVar = someVar } }
尝试过的错误写法及报错
写法1:
extension Predicate where Input == SomeType { }报错:Pack reference 'Input' requires expansion using keyword 'repeat'、Type pack 'Input' must be referenced with 'each'
写法2:
extension Predicate where each Input == SomeType { }报错:Pack reference 'Input' requires expansion using keyword 'repeat'
写法3:
extension Predicate where repeat each Input == (SomeType) { }报错:Same-element requirements are not yet supported
正确实现方案
直接针对 Predicate<SomeType> 做扩展,而非通过 where 子句约束参数包,代码如下:
extension Predicate<SomeType> { static func predicateMatchingNegativeSomeVars() -> Predicate<SomeType> { #Predicate<SomeType> { $0.someVar < 0 } } }
原理说明
Swift 当前版本对参数包的同元素约束支持尚未完善,直接指定扩展目标为 Predicate<SomeType>,可精准限定该方法仅在 Predicate 的参数包为单个 SomeType 类型时可用,完全符合需求。
内容的提问来源于stack exchange,提问作者iSpain17
相关产品推荐
相关产品推荐

