在 OC 时代,通过 .h 头文件以及 include 标记,还有那长长的 api 名称,可以很方便的意会和找到某个类。使用 Xcode 十年,在 Vim 的加持下,基本没用过啥快捷键。
最近在 Swift 里面一顿拾掇,理解源码也太复杂了。
1 个 class 在 3 个文件中增加了 5 个扩展并实现了 4 个协议,1 个文件中包含 400 行注释 500 行代码 10 多个杂七杂八的 enum/struct/class/extension/protocol,去他妈的。

一直都是夸奖 Swift 的,作为后现代语言,集百家长补百家短。
但不好的编程习惯对 Swift 来说会是灾难,文件名不在作为当前文件内容的强约束、无需 import 后的 extension 可以写在任意位置、enum/struct/class 是值类型值语义引用类型引用语义搞不愣清后的混用,等等,这些都会骤然增加 Swift 源码的理解。

不得已对 Xcode 进行一些调教。
目标是快速查阅继承、搜索、实现协议方、三方库文档等代码阅读操作。

Swift Package Manager (SPM) 已经被苹果放置于一个很重要的位置,在历史文章中对其做了一定的分析,Package 目前的定位和 Xcode Project .xcodeproj 同级别。SPM 不仅仅用于替代 Cocoapods,而是 Apple 后期语言研发生态的一部分。
鉴于 Xcode 对 Package 的支持,可以很方便的将项目中的代码进行组件化设计,做一定的逻辑分析即可拆分成多个 Package,这在开发过程中非常有利于项目的架构、单测、可持续性。
以前若这样做,需要对 Cocoapods 有深入的了解,这是一个比较复杂且细节的过程。通过 SPM 只需要 New - Package 即可,将复杂度从项目级别压缩到文件级别。

SPM 出现后,很多 Pods 模块通过增加 Package.swift 配置文件可以很方便交由 SPM 管理。但对于直接通过 Package.swift 创建的独立库,并没有方便的方案转为 Pods 管理,还是需要走一遍 Pods 的流程。
不过,这里做一个预言,Pods 终将被 SPM 取代,因为 SPM 是更具有可持续性和生态深度耦合,在 Xcode 整合 (编辑 / 搜索 / 联调等)、多平台兼容,源码管理、二进制库 / 仓库管理、CI 等方面,都具有得天独厚的优势。
相比 Pods 完善的脚本自定义能力 (基于 ruby 的生态),SPM 是有一定的短板,但不推荐。
很多大公司在做统一基建的时候,会深度魔改 Pods。简单的东西越做越复杂的原因,除了增加一些” 又不是不能用” 的功能,还有就是在复杂度提升后打的各种补丁。
虽然这么说,Pods 完善的自定义能力,SPM 也一样可以做到,毕竟这些能力很大部分都属于扩展能力,如插件。执行流程中大家都可以在 xcodebuild 等相关命令的任意位置,随时可以写一些定制脚本做插入执行。

初期,Swift Package 只能做源码 (开源) 共享,后面增加了 binaryTarget 能力,可以在提供了二进制库 (framework/xcframework) 的情况下,直接通过 SPM 做分发。(闭源共享)
但二进制库从哪里来,普遍的方案还是通过 .xcodeproj 的形式编译导出 framework/xcframework 库。
Swift Package 虽然支持导出动态库和静态库,但流程上还不彻底,并不能直接交付使用,下面对此做一些解释说明。

最喜爱 世界之窗,那个快如闪电的 Browser。

每个人都有自己喜欢的浏览器,但每个人都不满意自己喜欢的浏览器。这是当今 Browser 之乱现象。
归根结底,在于浏览器内核太过复杂,没有推倒革新的可能。只能依托 webkit/blink 内核之上做层层补补的体感优化。
但千人千面,一个浏览器能够适配多个人的使用习惯已经很困难,更何况兼容上亿用户的心情。

也属实没想到,在早已过了 Browser 大拼杀的今天,还有 Arc 这样的黑马闯了出来。
已经重度使用两月有余,忍不住做一下使用过程中的体验和分享。

Arc 使用的还是 Chrome-Blink 内核,重在用户使用体感上的创新。
早期通过会员邀请制预约排号(目前已经完全开放),当时体验了半小时有余,放弃了,感觉不到又什么亮点。重新尝试后,发现了很多亮点。
应该还是使用的多了,就发现了很多早期没有注意到的功能。也侧面反映一个点,一开始使用有可能劝退。
希望分享可以降低初次使用的劝退门槛。
但也如开头所言,可能您最后并不喜欢也不选择 Arc,概率或许还很大。

不推荐使用 Swift 写脚本,和 Python 比起来,该生态链相对匮乏,开发耗时会增加很多。
但对于偏 Swift 的同学来说,这也的确是更可控和方便维护的方式之一。尤其对于公司内部工具,有问题可以更快的找到原因并处理,不至于手忙脚乱。

通过 Swift 进行脚本开发的环境和入门,可参考:Swift 脚本开发环境搭建

在开发脚本的时候,经常会使用到在终端环境中安装 / 预制的命令、管道、文件读取等。这些能力,SwiftShell 做了完备的封装,很方便使用。
这里对该库源码进行一些解读。同时,也会做前置知识点如文件、管道、描述符、子进程进行简单介绍。

2024.01.06 更:欢迎查阅 Swift 开发的文本纠错命令行工具

不推荐使用 Swift 写脚本,和 Python 比起来,该生态链相对匮乏,开发耗时会增加很多。
但对于偏 Swift 的同学来说,这也的确是更可控和方便维护的方式之一。尤其对于公司内部工具,有问题可以更快的找到原因并处理,不至于手忙脚乱。

相对于 Python 环境丰富的基建资源,使用 Swift 做脚本开发的优点在于生态的一致性
苹果官方抹平了 脚本开发 和 应用开发 的界限,即 开发环境、三方库导入和使用 (苹果自身的开源库 / 三方库)、系统平台 api (存储、网络、协程、并发等,UI api 除外) 等,均表现一致。
可以像应用开发的流程一样,进行脚本命令行的开发。

2023.12.14 更:mac 14.2 版本,已经完全解决了中文输入法的问题。
2023.10.03 更:采用 twitter 网友的办法,我又换回系统输入法了。详见:https://x.com/hai_lv_/status/1704597086346649778?s=20

Mac 上原生的双拼输入法,有时候间歇性的卡死。在网上找了不少办法,均不能很好的解决。
我对原生输入法还是有不少感情的。自从 Mac 和 iPhone 支持小鹤双拼后,就迁移到了原生输入法,到目前也有很多年了。

这次把 Mac 侧迁移到 Rime,也尽量和原生的体验保持一致。鉴于 Rime 本身配置较为复杂,这里把自己使用的精简版做下记录。

体验说明(和 原生 的输入方式保持一致,包括中英文切换方式):

  1. 使用 CapsLock 键作为 英文 和 中文 的切换键。
  2. Rime 仅仅有 小鹤双拼 的输入能力,其他输入法包括英文均做了阉割。
  3. 各种类型的符号输入,和原生保持一致。还有 半角、全角、生僻字、Shift 快捷键 等。

基本上,就是无感切换了。

配置,都已经处理好了。真要配置这些细节,还是挺花费时间的,我前后共计花了 4-5 小时。
如果你和我的输入法使用习惯一致,建议直接拿去用,不要想着二次配置了。毕竟这只是工具。浪费时间不值得。
预计 10 分钟以内,可以完成本文配制,顺利使用 Rime 的小鹤双拼。

最近难得休了一次长假,计划和家人出去旅游。近十几年来,基本没有什么旅游经历。如果公司团建也算旅游的话,那也可以算增加一些经验值。
老婆说一直想看海,于是趁着旺季,把山东的威海和青岛逛了一圈。

简单记录一下威海和青岛两座城市的备忘,给有缘人。
威海主打的就是海,政府也对旅游提供了较大的支持,建设了一个环海公路。
去威海旅游,一辆电瓶车就可以解决一大半行程。有很多租电瓶车的地方,60 元 / 天。
沿着环海公路,可以直接从国际沙滩骑到海上公园,6 小时可以玩完,整个旅途都适合小孩子。
住的话,一定要选择在韩乐坊附近,最好距离韩乐坊 500-1000 米以内。这个位置距离海边也近,晚上有比较多的活动选择,尤其吃喝方便。
华夏城那里有一个小孩子的户外娱乐场所,非常棒。玩累了可以带孩子去耍,只在白天开放。

对于生活的记录,很多人已经完全依靠照片了。这些年手机和移动互联网起来后,生活记录一个在照片,一个在社交互动平台。
但是这有很大的局限性,通过这些,是没法把一个过程给串起来的,会出现很大篇幅的上下文缺失。
这和学习中的知识体系很相似,学习不能想到哪学到哪,而应该成体系。书、专栏等有章节的知识学习,才能够对一个方向有较强的认识。

在视频、照片、文字三种传播属性中,文字的穿透力是最强的,所以洗脑一定得依赖软文。
文字,是最能够全面记录一段过程的。很多人到了一定年纪,会想着出书,以留下一些东西,而不是出一个摄影集或者其他。

现在也很少人写日记了,我本人也有七八年没写日记了。前老板说,离开老家出来工作后,就把日记都给锁在了小屋子里,现在也很多年没写了。
日记,最能记录一个人的一生。只是在匆忙的工作生活中还夹带隐私,都不方便写了。

最近学习回顾了几门高级语言和周边工具。这里做个小总结,学习暂时告一段落,以后会在需要的时候再捡起来。

Swift:

Swift 这门语言,真的是大杂烩。集合了不知道多少语言的混杂体。
Swift 语法都觉得似成相识,比如 范型、异步、多线程、函数编程、闭包、下标、嵌套、元组、虚函数。不过这些能力都是一门高级语言本该支持的,也无可厚非。
后起的语言,的确是有后天优势的。很多语言都有历史遗留问题,比如 python 为了解决作用域问题,弄出来 global、local、nolocal 这样反人类的设计。

值类型和引用类型 (struct /class) 借鉴的 C++,详见之前的文章:Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用

元组,借鉴的 C++ 的 tuple。这是真好用,尤其在写算法的时候,可以省去不少逻辑复杂度。

属性包装器 propertyWrapper 借鉴 Java 的注解。

函数调用中的虚函数,借鉴 C++ 的虚函数设计。不过在函数调用这个问题上,也没有那么多选择,要么静态编译直接派发,要么虚函数存储方法列表派发,要么像 OC 一样动态派发,要么就得和 Java 这类一样靠虚拟机动态解析 (JIT 是直接派发)。本质就是找函数指针的过程。

2023 高考过去了,这两天老家也开始农忙了。体验过农忙的学生,一般都想着靠读书改变命运,不愿面对面朝黄土背朝天的广袤天地。
农村,是一片复杂的土地,无数的人想要离开,最后还是回到了那里。高考,就是一个敲门砖,离开农村的那块垫脚的砖。

在这片困乏饥饿的神州大地上,学历不一定代表未来,但没学历,是真的没有未来。
有学历,依旧会承受疲劳工作、生儿育女、职场危机、生活一地鸡毛、老年浑噩。
没有学历,对有学历所要承受的一个都少不了,只会更刻骨和铭记。还要承受低能、工作学历卡口等歧视。
所以,还是考的好一点吧。很多人都能上大学,但 985/211 和普通本科,是完全不一样的,本科和学院也是不一样的。
如果考的不好,请复习 1 年甚至 2 年,不要失去耐心。
多年之后,会发现上学是好轻松的活儿。上学也是上班,工作的好点,省去了以后多少的精神崩溃。

0%