Xcode 自动版本号

做开发者肯定有过这样的烦恼:版本号提交错了!

编译和测试的版本多了,难免提交的时候才发现版本号搞错了。要不就是后台版本号正确,前台的版本号忘记更改。其实,可以让前台自动获取后台的版本号数据,比如这样:

But

后台的版本号还是要自己手动写啊!大版本号也就罢了,不同的程序有自己不同的风格,有的甚至不是数字这就略过了,那么构[……]

点击跳转以继续阅读

一个自动排序的 Swift 栈

一年前,我在 git 上发布了一个用 Swift 实现的栈,一共有两个版本。因为 Swift 自身并没有实现这个东西——尽管官方的教程中泛型的部分就是用这个栈举的例子。

也许是人家觉得这个太简单了吧

总之,这次我又来玩这个东西了,因为 HMM 的 Viterbi 算法需要做修剪,不然路径太多无谓地增加计算量——毕竟,我们都关心第一名,谁会去注意第二名呢?

所以,这个栈也是基于原生 Arr[……]

点击跳转以继续阅读

我给落格输入法的用户群添加了个自动回复机器人

如题图,我给落格输入法的用户群弄了个机器人,随着落格输入法的用户越来越多,一些慕名而来的新手也多了。很多常见问题重复提问,搞得人焦头烂额,如果能有个机器人,就像 Siri 那样,让它自动捕捉那些关键字然后回复这些用户,岂不美哉?这样用户能够得到精心编辑的答案,而我也能空余出更多的时间去写wan代you码xi。

当然,这样的机器人我是见过的,所以我想一定有现成的东西,显然,搜索之下我先找到了这[……]

点击跳转以继续阅读

Swift 中判断字符串是否有 Emoji 表情

更新:网络上流传的 emoji 代码点不太完整,我按照维基百科的资料重新整理了一下,文中的 Swift 版本代码已更新。

很多时候我们需要判断一个字符、或者说是一句话里是不是包含了emoji,使用 Swift 语言开发 app 也不例外,比如可以使用正则表达式——但很遗憾,似乎不同的语言对于正则表达式的支持区别, \u [……]

点击跳转以继续阅读

落格输入法 是怎么实现 app 设置而不需要 完全访问 权限的?

众所周知,在 iOS 平台上自从 8.0 版本开始,可以为 iOS 开发第三方的输入法键盘了,而这些键盘可以被放在 AppStore 销售了,不过,同时也有着十分严格的权限规则。

对此,苹果为第三方的键盘设计了两种权限,一种是最小的,只有最基本的键盘功能的权限、另一种则相对较多,键盘获取了“完全访问”权限之后基本上就和 android 上键盘差不多,可以访问联系人、可以联网等等。

不过[……]

点击跳转以继续阅读

Could not load the “” image referenced from a nib in the bundle with identifier “com.xxx.xxx”

今天遇到一个奇怪的问题,程序运行一点问题都没有但终端报错如下

其实就是题目上的错误,这个问题看上去挺简单——不就是引用的图片丢失了么……

其实不然,由于名字是 "" 所以你根本找不到究竟是哪个图片丢失了——实际上一个都没有丢。

毕竟程序里边的资源一个都没有[……]

点击跳转以继续阅读

写 落格输入法 的这半年里获得的 一点人生经验

说出来你们可能不信,落格输入法起初是我的一个练手项目,它叫小飞

但在动手写它之前,其实我就已经抱怨过很多次了,说自己要写一款好用的输入法,因为我用双拼,而现存的输入法,都不怎么重视双拼这个群体,同时,就全拼来讲,各种广告弹窗小红点也把它们本身整句输入啊实用功能啊这些优点给埋没了。

一直到 2015 年 11 月 7 日,我第一次有了动手写一个输入法的想法:

现在iOS上的输入法大都臃肿[……]

点击跳转以继续阅读

CloudKit 优化指南

最近给落格输入法加入了一个叫做“对数云”的东西,其实不难,比使用 iCloud Document 要简单,不过网上的资料不太多,你通过那些上手教程来现充应该不是问题,但想要提升用户体验,就不是那么容易了。这里我们就一起来看看,怎么样才能让 CloudKit 运行得更畅快。

CKDatabaseOperation

一般来说,你获取一条数据可能是这样的:
[crayon-69054f1a939e[……]

点击跳转以继续阅读

让 iTrem 2 + zsh 启动不再等待!

iTerm 作为一个 mac 里自带终端的替代品真的是太好用了,功能多、界面也好看。配合zsh+皮肤,终端从此也美丽(题图)。

不过,zsh 启动总是很慢,虽然说每次启动前输入的内容还是不会丢失,但总等着也不是个事(说句实在话,我就这么忍受了好多年……)

总之,其实这个问题是可以被解决的:

进入 iTerm2 的偏好设置里,在 Profiles 里编辑你的配置,在配置右侧的 Ge[……]

点击跳转以继续阅读

在 Swift 中使用 cmph

cmph 的全称是 C Minimal Perfect Hashing Library ,是一个很著名的用 C 写成的最小完美哈希库,什么是完美哈希?

完美哈希

这里我们不讲原理,你只需要知道传统的哈希有冲突,我们需要靠各种算法来处理冲突就可以了,对于哈希,总是需要一个表,这个表里预留了很多位置,然后计算出来的值就是这些位置的坐标,你可以把对应的数据放到坐标里。

但这时候有一个问题,如果[……]

点击跳转以继续阅读

在字符串中 快速查找

很多时候,我们需要在字符串中执行查找,以判断过滤指定的内容出来。比如过在落格输入法当中,就需要用辅码过滤出需要的候选词。

一般来说,查找和对比肯定是数字来的最快,不过在词库上总不能把所有的词汇都转换为数字(虽然理论上可行……)在字符串的搜索上,我们有很多种办法来实现,这里我就说一下我自己的思路:

Set<String>

由于我的词库辅码筛选只对两字或者三字词汇生效,那么我考虑[……]

点击跳转以继续阅读

基于动态规划的整句输入法

一般来说,我们不会在用动态规划算法求解的问题上称呼它为“动态规划”,而是称之为“隐马尔可夫模型”,不过,如果我们单纯用动态规划算法来求解一个普通的有向无环图,那么就只能说是动态规划了……

这次我们要来说的,是基于词库的整句输入法。而不是基于状态转移的隐马尔可夫模型求解。

词库

由于不需要模型,我们的整句输入是基于词汇的,就需要一个词库。这个词库里应该记录了普通人大部分的常用词汇,而且有一[……]

点击跳转以继续阅读

ios 为视障用户支持 VoiceOver

其实很少用户知道,ios系统其实有一套完整的轻松访问机制,很多盲人或者说视障用户都喜欢使用iphone

所以说,作为一名开发者,我觉得不论是从产品销售面还是作为责任,都应该做好完善的轻松访问支持。

不过好在,得益于苹果严格的开发规范,所以一般只要你的app已经通过审核能够上架,那么基本上 VoiceOver 就已经能够很好的识别你 app 中的大部分内容了,比较通用的,比如 tabV[……]

点击跳转以继续阅读

iOS 平台 SQLite 性能优化

开始

在 ios 平台,数据永久化的存储方式就那么几种,比如说 coredata,比如说realm,还有nosql的几种方案,但是很遗憾,nosql的几种方案支持的功能都还是太少,这样就让对它们的选择显得十分鸡肋——毕竟,如果是简单的应用的话,那就还不如其他方案来的方便快捷——虽然nosql是趋势。

这次我们来谈谈另一种比较常见的储存方案——sqlite,这个东西很厉害,它是一个用c实现的[……]

点击跳转以继续阅读

如何自定义 落格输入法 ?

如何自定义落格输入法?

在落格输入法中,我为你提供了强大的自定义功能。不论是简单地新建一种双拼方案,还是导入一份五笔输入法的码表,它都能完成。

首先,我们从概念说起

按键映射方案

落格输入法用它来生成对应的映射方案,比如智能abc、比如自然码等等。按键映射方案有两个文件,比如“智能ABC.plist”那么就要有对应的“智能ABC_rev.plist”,后者不是必须,但如果你想开启“按键[……]

点击跳转以继续阅读

获取 中文 维基百科语料

最近在做输入法的词库,实现新的整句输入模型,(回头我会把之前的基于词的整句输入模型讲讲),新的整句输入模型是基于 HMM (也就是隐马尔可夫模型)来做的,当然了,由于我个人设备资金等有限,只做了二阶矩阵。不过即使如此,模型还是需要训练的。

当然,不是说用小说名著来训练就不好,只不过很难找到各行各业的相关小说,毕竟,它们覆盖的面积太单一了,这其实并不是高质量的语料库。说起高质量,那自然是非维基[……]

点击跳转以继续阅读

swift 中内存狂飙的问题

在使用 Swift 语言进行开发的时候,很多朋友会莫名奇妙地遇到内存爆满的问题,明明有 ARC ,明明释放了内存,却还是让程序的内存占用随着循环而一路飙升。

这里其实并不是出现了内存泄露,这其实是 ARC 的一个机制:在每一个主 Runloop 结束的时候进行清理。也就是说,它有一套必要的缓存机制——毕竟,实时释放的话谁能保证你的局部变量要不要留下来给后续的代码使用呢?

但显然,这个必[……]

点击跳转以继续阅读

SourceKitService 占用大量内存和 CPU 的解决办法

在使用 Xcode 进行 Swift 语言开发软件的时候,不少人在项目中后期都会遇到这么一个问题,如题图那样:SourceKitService 占用大量的 CPU 和内存,甚至直接导致系统卡死。

那么,这到底是怎么一回事呢? 在 StuckOverflow 上的高票答案是这么说的:

在活动监视器里找到 SourceKitService 双击它,看它打开了哪些目录,去把缓存删除然后强[……]

点击跳转以继续阅读

如何学习自然码辅码?

自然码是个比较古老的双拼方案了,有多古老?古老到现在不少用户都根本不知道它还有一套辅码方案。

自然码的辅码称不上是形码,它之所以被称为是辅码,就是因为这套方案的设计初衷还是作为辅助,所以它并不能像小牛辅码那样做到非常低的重码率——但是加上音的话,用起来还是很高效。

为什么就算如此还说它输入高效呢?因为它设计之初就是为了辅助,这就直接决定了这套方案十分容易被接受和学习!有多简单?就是偏旁[……]

点击跳转以继续阅读