
桌面应用【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址https://gitcode.com/GitHub_Trending/ti/tinycast点击查看免费下载Tinycast 是一款原生 macOS 启动器应用它的内置计算器不依赖任何独立模式只要在启动器输入框里敲入算式答案就会实时显示在结果列表上方的卡片上随输入逐字符刷新。本文以 Calculator 功能文档 为主体结合 CalcEngine.swift、CalcExpressionParser.swift、CurrencyRateStore.swift 等源码与 calc-test.swift 测试用例系统讲解其语法规则、量纲体系、汇率/时区等实时数据的离线策略以及计算历史与颜色卡片等配套能力帮助你把这套输入即答案的引擎用到极致。快速上手在启动器中直接输入算式输入一条算式答案立即出现在结果上方的卡片里。没有需要切换的模式——计算引擎会在每次按键时对输入做一次判定是计算就出卡片不是就当作普通的应用搜索。操作快捷键复制答案return复制算式含表达式⇧⌘return复制答案的同时会写入 Calculator History计算历史。从源码看复制动作由 CalculatorCoordinator.swift 统一处理回车复制答案时调用copyCalculatorResult⇧⌘↵则调用copyCalculationWithExpression把规范化的表达式与结果拼成表达式 结果的文本例如3×3 9再写入剪贴板两者都会先record进历史再关闭面板。一个纯单词永远不会触发计算卡片tomorrow、july、pi单独出现时都只是搜索词而不是算式。这与 CalcEngine.swift 的判定逻辑一致——输入必须包含数字、符号或可识别的量纲纯字母串会被直接判为普通搜索。算术隐式乘法、取模与科学计数法引擎对输入的容错和体贴程度相当高隐式乘法4(23)是 202pi、2sqrt(9)、(23)(23)都能正确求值。6/2(12)与6/2*(12)结果一致。数字间的x也当作乘号所以3x3、$5 x 2都成立。两个裸数字相邻绝不相乘5 3保持为搜索。取模用mod而非%因为%已经表示百分比。mod与乘除同级且保留第一个数的符号-10 mod 3得-1。在 CalcExpressionParser.swift 中mod被解析为绑定优先级 20 的二元运算与乘除同级这正是与乘除同级的源码证据。千位缩写10k是 10,000。科学计数法1e5、5e-3km、3e2都可用而2e和2 e仍表示 2 × 欧拉常数e。测试 calc-test.swift 还覆盖了1E6大写 E、1e3k指数后接紧凑后缀、10em避免把单位em误判为指数等边界情况。口语化开根square root of 25m2得5 mcube root of -8m3得-2 m支持带量纲的开方。尾随运算符会保留最后答案在屏幕上输入10 显示 10输入10kg 500g 显示 10,500 g这样在敲下一个数字时卡片不会闪烁。源码中对应 CalcEngine.swift 的partialResult当 token 流以运算符结尾时先对完整前缀求值再把规范化表达式替换为当前输入并附上运算符文本。优先级与结合性层面测试还验证了2^3^2是 512幂右结合、-2^2是 -4一元负号绑定比^松、3!!是 720阶乘可链式后缀、2**2等价于2^2Python/JS/shell 拼写别名。单位换算与量纲运算你最后输入的单位决定答案的单位输入结果5feet 1m2.524 m10kg 500g10,500 g1kg 500g 2lb磅pounds10kg 500g to lb磅末尾to覆盖一切10kg to lb 3lb先换算再加单位换算的底层转换公式见 CalcQuantity.swift(amount × from.factor from.offset − to.offset) / to.factor其中offset用于温度这类非线性标度。加/减的以最后单位作答行为在 CalcExpressionParser.swift 中实现显式/-会把左侧量转换到右侧单位再取右侧单位作为结果。并列的单位是一个整体而不是求和5 feet 3 inches是 5.25 ft以第一个单位作答1hr 30min是 1.5 hr。它们先结合成一个复合量5w * 3h 30min表示5w * (3h 30min)90km / 1h 30min得60 km/h。从 CalcExpressionParser.swift 看这类复合量以极高的组合绑定优先级40结合因此会先于后续乘除完成。裸数字继承相邻的单位5kg5是10 kg$10 5是15.00 USD见 CalcExpressionParser.swift 的(.unit, .scalar)分支非隐式运算时裸数字直接按左侧单位加减。百分比语义分场景/-时是相对量10kg 20%得 12 kg*//时是普通份额10kg * 3%得 0.3 kg10kg / 25%得 40 kg。对应 CalcExpressionParser.swift 的addOrSubtract分支百分比在加减中按left × (1 ± pct/100)计算。单位单独出现会转换到常用对应物1m给出英尺和英寸复合格式1hr给出 60 min。这就是 CalcUnits.swift 中autoTargets表的作用——无需关键词即可触发例如m → ft(复合)、kg → lb、L → gal温度仅有°C/°F/K的带符号拼写才支持裸转换以免5k误判为开尔文而抢占应用搜索。测量量可以组合出面积、体积、速度等输入结果5m * 4m20 m²2m * 3m * 4m to l24,000 Lsqrt(25m2)5 mcube root of -8m3-2 m100km / 2h to km/h50 km/h90km/h * 20min to km30 km100km / 40km/h to duration2 hr 30 min1GB / 100mbps to s80 s1500w * 2h to kwh3 kWh量纲dimension系统以 CalcDimension.swift 为核心乘法把维度相加、除法相减见 CalcExpressionParser.swift 的combine最终落到 CalcUnits.swift 的baseUnits基本单位表m、kg、s、m²、m³、m/s、pa、W、Hz、px 等。结果默认用基本单位除非你用to或in指定。功率乘时间给出 Wh 或 kWh、电流乘时间给出 Ah 或 mAh见 CalcUnits.swift 的productUnit超过 1000 W 的功率给 kWh≤0.001 A 的电流给 mAh。m²和m2都表示平方米而(2m)^2是对整个量求平方求圆的面积请写pi * (2m)^2。to timespan会把时长拆成多段145 mins to timespan是2 hr 25 min。周是最大的拆分单位因为一个月的长度并不固定。温度只能在同一种温标内做加减其余单位自由组合2kg / 4m3是0.5 kg/m³1kg/m3 to g/cm3是0.001 g/cm³。混用温标会得到明确错误见 CalcExpressionParser.swift 的 Cannot combine temperatures with different units.。体积与流量输入结果1m31,000 L2m * 30cm * 40cm to l240 Lpi * (10cm)^2 * 30cm to l9.424777961 L圆柱体500l / (2m * 1m) to cm25 cm容器水深10l / 2min to l/min5 L/min150l / 10l/min to duration15 min60l/min to m3/h3.6 m³/h体积单位支持mm³到m³外加in³、ft³、yd³上标³也可以写成普通数字3。液体计量包含 mL、cL、dL、L、杯cups、汤匙tablespoons、茶匙teaspoons以及美制加仑US gallons、夸脱quarts和品脱pints。流体盎司请写fl oz单独的oz是重量。英制单位是ukgal、ukqt、ukpint、ukfloz。电气计算输入结果5 watt * 3h 30min to kwh0.0175 kWh12V * 2A24 W12V / 6ohm2 A12V / 2A6 Ω500mA * 3h 30min1,750 mAh2000mAh / 500mA to hours4 hr需要注意C表示摄氏度因此库仑以As安培秒显示。大小写区分兆与毫MW是兆瓦mW是毫瓦。对应autoTargets中的完整映射CalcUnits.swiftW/kW/MW、A/mA/µA/MA、V/mV/kV/MV、Ω/mΩ/kΩ/MΩ、As/Ah/mAh 均可在不同量级间裸转换。像素与密度、REM 与 EM输入结果3000px / 300ppi to inches10 in5in * 300ppi1,500 px3000px / 10in to ppi300 ppisqrt((3840px)^2 (2160px)^2) / 27in163.1783089 ppi像素没有固定物理尺寸所以转英寸或厘米时必须给出密度ppi。最后一个例子用对角线算出 27 英寸 4K 显示器的实际像素密度。REM 与 EM输入结果24px1.5 rem2rem32 px16px to rem1 rem1rem 8px24 pxrem和em按浏览器默认的 16px 根字号换算。pt在此表示品脱英制体积单位而非排版点。复制px/rem/em结果时会去掉空格如24px可以直接粘贴进 CSS。这一行为来自 CalcEngine.swiftmeasurement载荷对像素类单位使用空分隔符拼装copyText其他单位则保留空格。数据与传输速率MB/s是兆字节每秒Mbps是兆比特每秒100Mbps to MB/s得12.5 MB/s。二进制单位MiB/s和比特量kbit同样可用。此外还支持吨t、英石st、海里nmi、马力hp、BTU、rpm、磅力lbf等单位。数据速率的裸转换映射在 CalcUnits.swiftMbps/kbps/Gbps/bps/Tbps与存储单位表bit/B/kB/MB/GB/TB/KiB/MiB/GiB/TiBCalcUnits.swift中定义。货币与加密货币输入含义1 euro to dollars具名货币换算€20 to GBP/20€ to GBP货币符号可在两侧eur to usd金额默认为 11 btc to eur加密货币$10 €5混合货币算术(20 sgd to usd) * 30先换算再乘100 USD / 4hr25 USD/hr25 USD/hr to EUR/min换算成另一种货币的速率共支持 159 种法币外加手工精选的加密货币列表CalcCurrency.cryptoCodes与汇率请求一起维护见 CurrencyRateStore.swift保证请求参数与汇率表不会漂移。单独金额按你 Mac 的地区货币作答在设置为孟加拉的 Mac 上输入1 usd会得到122.84 BDT。如果输入的是本地区货币则反过来换算成美元输入美元则换算成欧元——因为换算是输入单独金额的唯一理由。这一逻辑来自 CalcQuantity.swift 的regionTarget先取地区货币若地区货币恰好等于输入货币则改用 USD或输入为 USD 时改用 EUR。它读取的是系统地区设置——不会请求你的位置信息。一词多义的归属共享单词是有意分配的dollars可能指 22 种货币、francs10 种、pounds9 种、pesos8 种、rupees6 种。真正无法消歧的词不给卡片krona同时是瑞典和冰岛货币Tinycast 不会猜测。俚语不生效quid和bucks没有卡片rmb和renminbi可以因为 ISO 4217 标准本身就称该货币为 Yuan Renminbi。单位优先于货币10 pounds to kg是重量10 pounds to euros是钱1 cup to ml保持体积尽管CUP是古巴比索。加密货币代码优先于普通词1 sol是 Solana而soles才指秘鲁索尔。引擎的执行顺序保证了这一点——CalcEngine.swift 先评估量纲算术再做单位换算最后才是货币换算。汇率刷新机制汇率保存在 Mac 本地每 24 小时刷新一次从保存时刻起算CurrencyRateStore.swift 中refreshInterval 24 * 3600。重启 Tinycast 不会提前重新拉取——用全新副本打开时网络请求数为零。调度循环会先计算快照年龄未到期就睡眠到剩余时间结束CurrencyRateStore.swift。加密货币是尽力而为币价加载失败时法币照常工作币价 30 分钟后重试retryInterval 30 * 60CurrencyRateStore.swift。抓取使用无缓存的URLSessionconfig.urlCache nil磁盘快照是唯一副本法币与加密两个端点并行请求法币数据是整个快照的必要条件CurrencyRateStore.swift。离线时最后保存的汇率继续可用从未保存过则卡片直接说明而不是瞎猜。没有汇率的币种提示No exchange rate for CODE.。金额保留两位小数低于一美分时保留四位有效数字且总是完整写出1 IDR to USD是0.00005539 USD绝不会显示成5.539e-05。货币交叉汇率以基准币为中转amount / source × targetCalcCurrency.swift。日期与时间你想要示例距某时刻还有多久hrs till 9am、days till 9april距某时刻已过多久days since 9jul、hrs since noon某时刻加减today 3 weeks、now 90 min连续位移17.2.26 100 weekdays - 4 2月/年平移31.1.26 1 month、29.2.24 1 year两个时刻之差jul 4 - today、9:30 - 7:00 to minutes自某时刻起/前3 days from next monday at 7:30、2 weeks ago后几周的某个星期几monday in 3 weeks、friday in 2 weeks具名时刻tomorrow at 9am、next monday、aug 25答案是日期时会显示星期几因为日期本身不会把这点说出口——在 CalcDateTime.swift 中答案字符串只含日期星期几被放到了卡片的 targetBadge 上。till向前看since向后看。单独出现的日期取最近的年份三天前的日期就是指三天前而不是明年同一天monthDayMoment的.nearest分支CalcDateTime.swift。时刻后的裸数字表示小时、日期后的裸数字表示天数3:45pm 5是 8:45 PMaugust 5 5是 10 月……即 8 月 5 日 5 天 8 月 10 日。月/年平移遵循日历31.1.26 1 month落在 2 月 28 日。 1 day跨夏令时仍保留钟点时刻 24 hours则是精确加 24 小时。带点号的日期是日在前19.2.27表示 2027 年 2 月 19 日28. aug也可以。带斜杠的日期是月在前。两位年份中 00–68 属于 2000 年代69–99 属于 1900 年代fullYearCalcDateTime.swift。普通分数如5/2 - 1/2仍然是算术。工作日weekdays、business days、work days、working days都会跳过周六周日today 5 business days、5 weekdays from now。公共节假日不计算在内。工作日算法在 CalcDateTime.swift 的addBusinessDays中实现先跳过周末对齐整周直接跳 5×7 天余数逐日推进并跳过周末。作为单位单独出现时一个workday是八小时55h in workdays。Unix 时间now to unix给出整秒now to unix ms给出毫秒。unix 0 to date和1000 unix ms反向转换回日期。形如2026-07-24T07:30:0002:00 30min的时间戳也可以运算支持Z后缀或时区偏移ISO 时间戳解析在 CalcTimestamp.swift。时区输入结果time in Tokyo那里现在的时间what time is it in London同上5pm ldn in sf伦敦下午 5 点换算成旧金山时间9:30am in nyc你的 9:30 AM换算成纽约时间5pm ldn in sf 2h上述时间再加 2 小时time in sao paulo 5五小时后的圣保罗时间diff paris巴黎与你所在时区的时差time in 4 hours in san francisco四小时后的旧金山时间答案落在另一天时会标注(tomorrow)或(yesterday)dayOffsetNoteCalcTimeZone.swift 按两个时区的公历日期差值判断避免 DST 干扰。城市来自macOS 内置的 IANA 时区数据库TimeZone.knownTimeZoneIdentifiersCalcTimeZone.swift外加约一百个数据库未命名的常用城市如 Salzburg、Basel。重音可有可无所以zurich也能命中。常用缩写同样可用pst、cet、jst、sf、nyc、ldn以及lhr、nrt、sfo这类机场三字码——全部来自手工维护的别名组CalcTimeZone.swift。这一切完全离线运行Tinycast 不会在线查城市城市名解析在本地完成。百分比、比率与列表输入结果20% off 50040015% tip on 426.350 as % of 20025%50 is what % of 20025%30 is 20% of what150ratio of 1920 to 108016 : 9average of 10, 20, 3020round 47 to nearest 545卡片会用语义标签标明数字含义——Tip、Discounted或Ratio——而不是干巴巴的 Result。这类自然语言百分比由 CalcPercent.swift 解析。函数与比较函数接受逗号分隔的多参数hypot(3,4)、round(3.14159,2)、log(8,2)、gcd(12,18)、lcm(4,6)、atan2(1,1)、pow(2,10)、root(-8,3)。此外还有反三角函数和双曲三角函数、cbrt、exp、log2、sign、trunc以及常数tau和phi。函数大小写不敏感测试里SQRT(64)与sqrt(64)等价三角函数的量纲参数可直接使用角度sin(30deg)得 0.5CalcExpressionParser.swift。min、max、sum、avg、mean、average接受列表且列表可以带单位sum(1km,500m)是1.5 km函数内参数会先统一到第一个参数的单位CalcExpressionParser.swift。函数内请写1000而非1,000因为逗号在那里是参数分隔符。、!、、、、可以比较数字或匹配的单位1km 1000m得true。整数支持、|、xor、~、、位运算^始终是乘方。进制转换双向可用0xff按十六进制读入并显示十进制2m / 2m to hex得0x1。任意表达式都可以to hex/to binary等baseConversionCalcEngine.swift。错误处理只对真正的错误报错错误只留给真正的失误量纲不匹配的单位1kg 1m或单位对货币的非法换算Cannot convert Currency to Weight.。其余情况保持安静而不是在输入过程中闪烁错误——半截算式不是错误它只是还没打完。这一点在 CalcEngine.swift 的CalcResult载荷设计中体现error载荷只由明确的转换尝试产生半成品输入会直接返回nil无卡片而不是报错。计算历史Calculator History是独立屏幕通过同名命令打开不在tab循环内在空搜索框按esc或delete退出。操作快捷键复制答案return复制表达式⌘return删除条目⌃X清空全部⌃⇧X历史实现在 CalculatorHistoryStore.swift 中几个值得注意的细节历史以 JSON 文件保存在AppPaths.applicationSupport()/calculator-history.json上限 200 条新条目插到最前cap 200。防重复连续复制同一条结果连按两次回车或从历史中复制不会堆积重复条目record的首条比对。搜索记忆搜索结果按(query, revision)记忆化方向键导航重绘时复用过滤结果而不是反复扫描全部条目searchMemo。删除全部会先弹确认对话框CalculatorCoordinator.swift因为该操作不可撤销从历史行复制答案时不会再次写入历史。颜色卡片把颜色粘贴进启动器例如#FF5733、rgb(255, 87, 51)或hsl(11, 100%, 60%)就会显示一个带色板的颜色卡片。⌘K可以按hex、rgba()、hsl()或oklch()四种格式循环复制。测试与可验证性整个计算引擎是纯 Foundation 实现、不依赖 UI因此可以独立编译测试。仓库中的 calc-test.swift 共 1700 余行断言覆盖了本文几乎所有示例隐式乘法与优先级4(23)、2^3^2、紧凑千位后缀10k、科学计数法边界10em仍是单位、量纲运算2m / 2m to hex、百分比语义、日期算术31.1.26 1 month、时区5pm ldn in sf、汇率错误文案No exchange rate for CRC.含组合字符colón的归一化、长表达式上限128 个1项被拒绝等。测试同时通过expectDisplay屏幕显示、expectCopy复制文本与expectExpression卡片左侧规范化回显三个维度校验输出是理解引擎行为最直接的参考。小结Tinycast 计算器本质上是一个输入即答案的多域表达式引擎以 CalcEngine.swift 为调度中枢依次尝试日期时间CalcDateTime.swift、时区CalcTimeZone.swift、量纲算术CalcExpressionParser.swift、单位/货币换算CalcUnits.swift、CalcCurrency.swift与自然语言百分比CalcPercent.swift最终把结果渲染成带语义标签的内联卡片。它把尾随运算符不闪烁单位按最后输入作答汇率 24 小时离线可用时区查询零网络请求等细节打磨成了可复用的计算体验配合 200 条上限的历史记录与四种格式的颜色复制足以覆盖日常开发与生活场景中绝大部分即时计算需求。赞分享桌面应用【免费下载链接】tinycastTinycast — a tiny, fully native macOS launcher, hotkeys, and clipboard history.项目地址https://gitcode.com/GitHub_Trending/ti/tinycast点击查看免费下载相关推荐Tinycast 内联计算器引擎深度解析从日期语法到货币汇率注入的 Foundation-only 架构Tinycast 内联计算器引擎深度解析从日期语法到货币汇率注入的 Foundation only 架构 Tinycast 是一款纯原生的 macOS 启动器桌面应用WeChatMsg基于本地化处理的微信聊天记录数据持久化技术方案WeChatMsg基于本地化处理的微信聊天记录数据持久化技术方案 在数字通信成为主流的时代微信聊天记录承载着个人社交关系、工作沟通和情感记忆的多维度数据。然桌面应用AI 应用插件系统SearXNG计算器插件内置数学计算和单位转换功能SearXNG计算器插件内置数学计算和单位转换功能 还在为频繁切换计算器应用而烦恼SearXNG一个免费的互联网元搜索引擎内置了强大的计算器和单位转换功后端搜索引擎创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考