如何为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
相关产品推荐
相关产品推荐

