Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述

Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0,它进一步完善了 Swift 语言的语法和语义,并再接再厉------强化了现代化并发模型的安全性和灵活性。

这里我们不妨用 Swift 来验证一个实际世界中有趣的小疑问:汉语中到底有没有拼音首字母全部相同的 4 字成语呢?

在本篇博文中,您将学到如下内容:

  • 概述
  • [1. 一个"悬悬而望"的问题](#1. 一个“悬悬而望”的问题)
  • [2. 自力更生](#2. 自力更生)
  • [3. 如何获取汉字的拼音](#3. 如何获取汉字的拼音)
  • 总结

到底问题的谜底将会如何?结果绝对会让大家"始料不及"!

那还等什么呢?Let's go!!!😉


1. 一个"悬悬而望"的问题

我一直对中国博大精深的成语世界兴趣盎然,有个藏在心底很久的问题一直想知道答案:四字成语里有没有 4 个字的拼音首字母都相同的成语呢?

比如 左道旁门(zuǒ dào páng mén) 这个成语中每个字拼音的第一个字母分别为 z、d、p 和 m,不符合要求。而成语 樽俎折冲(zūn zǔ zhé chōng) 前 3 个字的拼音首字母都为 z,可惜最后一个字拼音的首字母却为 c ,从而也无奈的丧失了候选资格。


樽俎折冲

释义:指不以武力而在宴席交谈中制胜敌人,泛指外交谈判活动。折冲,使敌人战车后撤,指击退敌军。

出处:语出汉·刘向《新序·杂事一》

示例:今吾国以存亡关系而不签字,各国当能见谅,必可留作悬案,为他日~之馀地。

★《五四"爱国运动资料·学界风潮记下编》


俗话说得好:"最好的代码是还没有写的代码",所以在实际撸码解决这个问题之前,我想试试有没有其它方法能够找到这个问题的答案,现在很火的"当红炸子鸡" AI 无疑值得一试。

首先尝试的是豆包 AI 引擎。可以看到她似乎没搞懂我的问题,给出了完全错误的答案:

接下来再试试 Kimi 引擎。这次 AI 扳回一局,Kimi 不但正确读懂了我的意图,而且给出了不止一个正确答案:

最后我们再试试 ChatGPT 和其衍生 AI 引擎:

可以看到它开始举了一些错误的例子("心心相印"、"自作自受"等),但随后又给出了几个正确的答案,真不知道它是到底是啥子脑回路。

但好奇心作祟的我们不禁要问:除了上面这些成语,还有其它符合条件的成语吗?


更多其它 Swift 趣味开发的小"栗子",请小伙伴们移步如下链接观赏有趣且精彩的内容:


2. 自力更生

接下来我们就来看看如何撸码来完成这项貌似"艰巨"的任务。

大致的思路其实很简单:先获取尽可能多的成语文本,然后计算它们的拼音,最后判断这些拼音的首字母是否相同。

需要说明的是,如今网上有很多公开的 API 接口可以帮助我们查询某个成语的释义、出处等信息,有的甚至可以模糊查找,比如查询"左"字开头和"门"字结尾的成语。但这些 API 都没有提供遍历所有成语的方法,所以对于我们这个需要蛮力来攻克的问题可能都有些力不从心。

不过不要紧,我们幸运的从网上找到一个包含超过 3w 个成语的文本文件,我想这是一个很好的开端。

3. 如何获取汉字的拼音

在掌控海量成语文本之后,接下来的问题是如何获取它们的拼音。

Swift 对于汉字拼音的支持比小伙伴们想象的要好很多,我们不用借助任何第三方库,只需使用 Swift 系统框架中的 API 即可完美实现。

swift 复制代码
let idiomString = "樽前月下"
print(idiomString)
let cfString = CFStringCreateMutableCopy(nil, 0, idiomString as CFString)
CFStringTransform(cfString, nil, kCFStringTransformToLatin, false)
print("带声调的拼音:\(cfString! as String)")
CFStringTransform(cfString, nil, kCFStringTransformStripCombiningMarks, false)
print("不带声调的拼音: \(cfString! as String)")

运行结果如下所示,我们可以选择输出带声调或不带声调的拼音:

不过本例中我们无需多此一举,因为对应的成语文本文件中已经包含了拼音信息,实际上除了拼音以外该文件还包含了与每个成语相关的其它丰富信息:

樽酒论文 拼音:zūn jiǔ lùn wén释义:一边喝酒,一边议论文章。出处:唐·杜甫《春日忆李白》诗何时一樽酒,重与细论文。"示例:连年客里度初度,~第一遭。★陈世宜《上巳社集是日值余初度》诗

其中甚至包括了许多超过 4 字的成语:

来是是非人,去是是非者 拼音:lái shì shì fēi rén,qù shì shì fēi zhě释义:犹言解铃还是系铃人。指谁惹起的是非,还得由谁来了结。出处:无示例:无

其实这些附加内容对我们这个例子来说基本没啥用,而且带来了解析上的额外麻烦。不过不要紧,因为我们本来就是在"自找麻烦"。

在下一篇博文中,看我们如何继续扮演"麻烦制造者"的角色,不见不散!


想要进一步系统地学习 Swift 开发的小伙伴们,可以来我的《Swift 语言开发精讲》专栏逛一逛哦:


总结

在本篇博文中,我们讨论了用 Swift 语言解决一个成语小问题预先所需要的准备工作。

感谢观赏,我们下一篇见!😎

相关推荐
FrankHuang8884 小时前
使用高斯朴素贝叶斯算法对鸢尾花数据集进行分类
算法·机器学习·ai·分类
武子康4 小时前
AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书
人工智能·爬虫·gpt·算法·机器学习·ai·音视频
张铁牛5 小时前
2. LangChain4j-AIServices,原来调用AI这么简单?
ai·langchain4j
season_zhu7 小时前
iOS开发:关于日志框架
ios·架构·swift
宝桥南山9 小时前
DeepSeek - 尝试一下GitHub Models中的DeepSeek
microsoft·ai·微软·c#·github·.net
大熊猫侯佩11 小时前
SwiftUI 中如何花样玩转 SF Symbols 符号动画和过渡特效
swiftui·swift·apple
wang_yb11 小时前
稀疏表示与字典学习:让数据“瘦身”的魔法
ai·databook
大熊猫侯佩12 小时前
SwiftData 共享数据库在 App 中的改变无法被 Widgets 感知的原因和解决
swiftui·swift·apple
大熊猫侯佩12 小时前
使用令牌(Token)进一步优化 SwiftData 2.0 中历史记录追踪(History Trace)的使用
数据库·swift·apple
大熊猫侯佩12 小时前
SwiftUI 在 iOS 18 中的 ForEach 点击手势逻辑发生改变的解决
swiftui·swift·apple