Cocoa NSExpression 详解

简介: 每当涉及查询或者整理信息时,Cocoa总是其他标准库羡慕的对象。通过使用NSPredicate,NSSortDescriptor,以及偶尔使用NSFetchRequest,即使是最复杂的数据任务也可以被简化成为几行极其容易读懂的代码。

每当涉及查询或者整理信息时,Cocoa总是其他标准库羡慕的对象。通过使用NSPredicate,NSSortDescriptor,以及偶尔使用NSFetchRequest,即使是最复杂的数据任务也可以被简化成为几行极其容易读懂的代码。


现在,NSHipster们无疑已经熟悉NSPredicate 了,不过如果我们更进一步看看NSPredicate,我们会发现NSPredicate其实是由更小的部分而组成:两个NSExpression(一个左手值和一个右手值),和一个运算符相比较(比如<INLIKE等等)。

image.png

大多数开发者通过+predicateWithFormat:来使用NSPredicate,NSExpression是一个相对难懂的类。真可惜啊,因为NSExpression本身的功能非常强大。所以,亲爱的读者,请允许我来表达我对NSExpression深深的尊重和着迷:


评估数学

关于NSExpression你所要知道的第一件事就是它的主要目的是减少表达。如果你思考一下评估NSPredicate的过程,你会发现它有两个表达和一个比较符号,所以我们需要将两个表达简化为运算符可以处理的表达–非常像编译一行代码的过程。

这就是我们要学习的NSExpression的第一招: 做数学题。


NSExpression *expression = [NSExpression expressionWithFormat:@"4 + 5 - 2**3"];

id value = [expression expressionValueWithObject:nil context:nil]; // => 1

这并不是Wolfram Alpha,但是如果加入评估数学表达式对于你的应用很有用的话,那么…你就可以使用NSExpression。


函数

我们仅仅触及了NSExpression的表面。觉得一台电脑仅仅做小学数学不怎么厉害?那高中的统计学怎么样?

NSArray *numbers = @[@1, @2, @3, @4, @4, @5, @9, @11];

NSExpression *expression = [NSExpression expressionForFunction:@"stddev:"arguments:@[[NSExpression expressionForConstantValue:numbers]]];

id value = [expression expressionValueWithObject:nilcontext:nil]; // => 3.21859...

NSExpression 函数以给定数目的子表达式作为参数。比如,在上述例子中,要得到集合的标准差,数列中的数字要被+expressionForConstantValue:封装。虽然只是一个小小的不便(它最终却能使得NSExpression变得极其灵活),却足以使第一次尝试它的人绊倒。


如果你觉得键值编码简单集合运算符 (@avg,@sum等等)不够用,也许NSExpression的自带的统计,算术和位运算功能能激起你的兴趣。

要注意的是:根据Apple的NSExpression文档中的表格,很明显,Mac OS X & iOS的功能可用性之间没有重叠。看起来最近的iOS版本的确支持如stddev之类的函数,但这些变化并没有显示在头文件或者文档里。如果你注意到任何变化,请以pull request的形式告诉我,不胜感激。


统计

average:

sum:

count:

min:

max:

median:

mode:

stddev:


基本运算

这些函数需要用两个NSExpression对象来表达数字。

add:to:

from:subtract:

multiply:by:

divide:by:

modulus:by:

abs:

高级运算

sqrt:

log:

ln:

raise:toPower:

exp:


边界函数

ceiling: – (不小于数组中的值的最小积分值)

trunc: – (最接近但不大于数组中的值的积分值)

与math.h函数类似的函数

ceiling非常容易和ceil(3)混淆。ceiling作用于数字数组,而ceil(3)作用于一个double值(且它并没对应的内置NSExpression函数)。floor:在这里的作用和floor(3)一样。


随机函数

两个变量–一个带参数,一个不带参数。不带参数时,random返回rand(3)的等值,而random:则从NSExpression的数字数组中取任意元素。

random

random:

二进制运算

bitwiseAnd:with:

bitwiseOr:with:

bitwiseXor:with:

leftshift:by:

rightshift:by:

onesComplement:


日期函数

now


字符串函数

lowercase:

uppercase:


空操作

noindex:


自定义函数

除了这些内置的函数,你也可以在NSExpression中调用自定义函数。由Dave DeLong所撰写的这篇文章(Using custom functions with NSExpression ) 详述了这个过程。

首先,在类别中定义一个对应的函数:

@interface NSNumber (Factorial)

- (NSNumber *)factorial;

@end

@implementation NSNumber (Factorial)

- (NSNumber *)factorial {

   return @(tgamma([self doubleValue] + 1));

}

@end

然后,这样使用函数(+expressionWithFormat: 中的FUNCTION()宏是构造-expressionForFunction:等等的过程的简写。):

NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION(4.2, 'factorial')"];

id value = [expression expressionValueWithObject:nil context:nil]; // 32.578...

这样的优势在于, 通过直接调用-factorial,我们可以调用NSPredicate查询中的函数。比如,我们可以定义一个location:withinRadius:方法来轻松的查询用户当前位置附近的管理对象。

正如Dave在他的文章中所提到的那样,这些用例十分边缘化,但它们肯定可以成为你的保留节目中有趣的技巧。

相关文章
|
11月前
|
Linux 网络安全 虚拟化
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
1348 1
|
20天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32261 117
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
9天前
|
应用服务中间件 API 网络安全
3分钟汉化OpenClaw,使用Docker快速部署启动OpenClaw(Clawdbot)教程
2026年全新推出的OpenClaw汉化版,是基于Claude API开发的智能对话系统本土化优化版本,解决了原版英文界面的使用壁垒,实现了界面、文档、指令的全中文适配。该版本采用Docker容器化部署方案,开箱即用,支持Linux、macOS、Windows全平台运行,适配个人、企业、生产等多种使用场景,同时具备灵活的配置选项和强大的扩展能力。本文将从项目简介、部署前准备、快速部署、详细配置、问题排查、监控维护等方面,提供完整的部署与使用指南,文中包含实操代码命令,确保不同技术水平的用户都能快速落地使用。
4738 4
|
15天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
6834 18
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
14天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
4803 11
|
16天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5683 21
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
12天前
|
人工智能 JavaScript 安全
Claude Code 安装指南
Claude Code 是 Anthropic 推出的本地 AI 编程助手,支持 Mac/Linux/WSL/Windows 多平台一键安装(Shell/PowerShell/Homebrew/NPM),提供 CLI 交互、代码生成、审查、Git 提交等能力,并内置丰富斜杠命令与自动更新机制。
4294 0
|
16天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
6258 6