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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:22:33