如何在#Predicate宏中检查字符串是否包含特定前缀?
解决#Predicate宏不支持hasPrefix(_:)的问题
可行方案:
用
starts(with:)替代hasPrefix(_:)
#Predicate宏支持Foundation框架中String的starts(with:)方法,逻辑和hasPrefix完全一致,且能被正确转译为NSPredicate的BEGINSWITH语句。代码示例:let predicate = #Predicate<String> { $0.starts(with: "some prefix") }直接基于NSPredicate转换
若习惯传统的NSPredicate字符串语法,可先创建NSPredicate实例,再转换为Predicate类型:let nsPredicate = NSPredicate(format: "SELF BEGINSWITH %@", "some prefix") let predicate = Predicate<String>(from: nsPredicate)手动实现前缀匹配逻辑
通过字符串前缀截取与目标值比较的方式,也能被#Predicate宏正常解析:let targetPrefix = "some prefix" let predicate = #Predicate<String> { $0.prefix(targetPrefix.count) == targetPrefix }
补充说明:
#Predicate宏对Swift标准库的部分方法支持有限,hasPrefix(_:)属于Swift原生String的方法,未被宏的解析逻辑覆盖;而Foundation的starts(with:)因与NSPredicate的BEGINSWITH映射更直接,所以被纳入支持范围。
内容的提问来源于stack exchange,提问作者parapote
相关产品推荐
相关产品推荐

