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

如何为SwiftData @Query创建ENDSWITH谓词?

解决SwiftData @Query的ENDSWITH谓词实现问题

SwiftData的#Predicate构建器仅支持固定的表达式集合,hasSuffix(_:)不在其中,你可以通过以下两种方式实现结尾匹配的逻辑:

方法一:使用字符串格式谓词

直接借助传统谓词的ENDSWITH语法初始化Predicate:

extension Filter {

    var predicate: Predicate<WordModel>? {
        switch self {
        case .all:
            .none
        case .lettersContaining(let string):
            #Predicate<WordModel> {
                $0.letters.localizedStandardContains(string)
            }
        case .lettersStartingWith(let string):
            #Predicate<WordModel> {
                $0.letters.starts(with: string)
            }
        case .lettersEndingWith(let string):
            // 使用字符串格式的ENDSWITH谓词
            Predicate(format: "letters ENDSWITH %@", string)
        }
    }
}

如果需要忽略大小写匹配,可改用带修饰符的语法:

Predicate(format: "letters ENDSWITH[c] %@", string)

方法二:使用PredicateExpressions的EndsWith表达式

利用SwiftData官方提供的EndsWith表达式(属于PredicateExpressions框架),直接在#Predicate构建器中使用:

import PredicateExpressions // 若未自动导入需手动添加

extension Filter {

    var predicate: Predicate<WordModel>? {
        switch self {
        case .all:
            .none
        case .lettersContaining(let string):
            #Predicate<WordModel> {
                $0.letters.localizedStandardContains(string)
            }
        case .lettersStartingWith(let string):
            #Predicate<WordModel> {
                $0.letters.starts(with: string)
            }
        case .lettersEndingWith(let string):
            #Predicate<WordModel> {
                // 使用EndsWith表达式实现结尾匹配
                EndsWith($0.letters, string)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Geri Borbás

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:48:22