谓词编程指南(摘要)

  1. 谓词概览
  2. 创建谓词
    1. 使用格式化字符串创建谓词
      1. 字符串常量、变量及通配符
      2. 布尔值
      3. 动态属性名
    2. 在代码中创建谓词
    3. 使用谓词模板创建谓词
    4. 格式化字符串总结
  3. 使用谓词
    1. 对谓词进行评估
    2. 谓词与数组结合
    3. 在谓词中使用键路径
    4. Null值
    5. 性能
  4. 谓词格式化字符串语法
    1. 分析器基本要素
    2. 基本比较
    3. 布尔值谓词
    4. 基本复合谓词
    5. 字符串比较
    6. 集合操作
    7. 标识符
    8. 字面量
    9. 保留字

在Cocoa中,谓词提供了指定查询的一个通用手段。谓词系统在多个领域都是能干的,包括Core Data及Spotlight。谓词是一个逻辑操作符,只返回布尔值。

两类谓词:

  1. 比较谓词:使用一个操作符比较两个表达式。
  2. 复合谓词:比较两个或更多谓词的结果,或否定其它谓词。

谓词的类型比较广泛,包括:

  • 简单比较,如grade == 7或firstName like ‘Mark’
  • 不区分大小写或字符的查找,如name contains[cd] ‘citroen’
  • 逻辑操作,如(firstName begins with ‘M’) AND (lastName like ‘Adderley’)

与谓词相关的类:nspredicateNSComparisonPredicateNSCompoundPredicate

谓词表达式是用NSExpression表示的。

谓词的局限性:

不提供并集、交集功能。谓词能不能正常工作,与操作符相关,也与后台存储相关,例如:
matches操作符使用了regex,尽管它可以在内存过滤中工作,但不被Core Data的sql存储所支持。
Core Data的sql存储的每次查询只支持一对多操作,此时,谓词中只能使用ALL、ANY、IN三个操作符中的一个。

创建谓词

使用格式化字符串创建谓词

使用nspredicate的类方法predicateWithFormat:创建谓词。

在这个示例中,[cd]表示大小写及发音符号不敏感。

谓词字符串分析器对空白不敏感,对关键字大小写不敏感,支持嵌套的括号表达式。也支持格式化参数,例如%x、%@。在谓词中,可以使用$指示一个变量,例如$VAR_NAME。分析器不会进行语法检查。

字符串常量、变量及通配符

字符串常量必须使用引号,单引号、双引号均可,但单引号不能匹配双引号。使用变量置换时,例如firstName like %@,此时,引号会被自动添加进去。如果在格式化字符串中使用了字符串常量,就必须自己对其添加引号。

使用通配符时,要先将通配符添加到变量中,然后再进行置换。

1
2
3
4
Nsstring *prefix @"prefix" ;
*suffix @"suffix" ;
@"SELF like[c] %@" [ [ prefix stringByAppendingString @"*" ] stringByAppendingString :suffix ;
BOOL ok predicate evaluateWithObject @"prefixxxxxxsuffix" ;

上面的示例,得到的谓词字符串是SELF LIKE[c] “prefix*suffix”,ok的值是YES。

但如果是这样写:

1
2
predicate @"SELF like[c] %@*%@" , prefix suffix ;
ok [ predicate evaluateWithObject @"prefixxxxxxsuffix" ;

谓词编程指南摘要的更多相关文章

  1. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

  2. iOS >>块>>更改块外部的变量值

    我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 使用附加字符串本地化Info.plist变量

    我正在尝试本地化应用程序的名称,同时仍然能够根据构建配置追加字符串.所以目前它被设置为:该设置定义为:通过这种方式,我们可以为应用程序添加后缀以用于不同的beta版本.问题是,当我们尝试本地化本地化的InfoPlist.strings中的应用程序显示名称时,就像这样我们覆盖存储在Info.plist中的值,并丢失后缀字符.这有什么好办法吗?

  5. iOS – 开始iOS教程 – 变量之前的下划线?

    这是正确的还是我做错了什么?

  6. ios – 静态计算变量被多次实例化

    我有一个日期格式化程序,我试图在UITableViewCell子类中创建一个单例,所以我创建了一个这样的计算属性:问题是我不止一次看到print语句,这意味着它不止一次被创建.我已经找到了其他方法,但我很想知道这里发生了什么.有任何想法吗?解决方法您的代码段相当于只获取属性,基本上它与以下内容相同:如果你只想运行一次,你应该像定义一个惰性属性一样定义它:

  7. ios – UIApplication.delegate必须仅在主线程中使用[复制]

    我应该在主调度中的viewControllers中声明这些)变量位置声明定义了它的范围.您需要确定这些变量的范围.您可以将它们声明为项目或应用程序级别(全局),类级别或特定此功能级别.如果要在其他ViewControllers中使用这些变量,则使用公共/开放/内部访问控制将其声明为全局或类级别.

  8. ios – 无法理解Objective-C块文档

    为什么localVariable“按价值使用?”>如果我在第二个例子中将__block存储类型添加到localVariable,我错误地假设该块关闭了变量,所以它将它保留在堆中直到块被释放?解决方法Howexactlyisoneexample“accessedbyreference”whiletheotheroneisaccessedbyvariable?self是当前正在执行找到块的方法的对象.强引用只是意味着对象的保留计数增加.IfIaddthe__blockstoragetypetolocalVar

  9. ios – 为BOOL变量编写getter和setter

    显然,使用obj-c,通常没有理由编写getter和setter(感谢有用的mr@synthesize).所以现在,需要做到这一点,我遇到了一个我不知道如何编写它们的问题.:p我敢肯定我可能不会以正确的方式解决我的问题–只是将我的对象子类化得更容易–但我正在尝试编写类别代码以添加属性,因为(在开头)它更快,因为我想学习如何在我的应用程序中使用类别代码.我有这个:我在setter中没有if查询就试过

  10. ios – 为什么不保留__block变量(在非ARC环境中)?

    我正在阅读__blockvariables上的文档,并考虑我使用__block的情况.对我来说,似乎我需要两种情况:>在块中使用时将变量标记为读写>在块内引用self时避免保留周期从表面上看,这两件事似乎并不相关.我认为__block变量没有被保留为更多的技巧我需要记住避免保留周期的特定用例.我想知道,为什么不能保留它们是否有更重要的建筑理由?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部