惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Cloudbric
Cloudbric
C
CERT Recently Published Vulnerability Notes
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
C
Cisco Blogs
T
Tenable Blog
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
I
Intezer
AWS News Blog
AWS News Blog
IT之家
IT之家
博客园 - 司徒正美
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
S
SegmentFault 最新的问题
博客园 - Franky
人人都是产品经理
人人都是产品经理
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
Visual Studio Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Hacker News: Front Page
Latest news
Latest news
Scott Helme
Scott Helme
腾讯CDC
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
S
Securelist
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog
Project Zero
Project Zero
Google DeepMind News
Google DeepMind News
P
Palo Alto Networks Blog
F
Fortinet All Blogs
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 最新话题
S
Schneier on Security
NISL@THU
NISL@THU
Jina AI
Jina AI
M
MIT News - Artificial intelligence

一个工匠

AI 发展临界点 - 快上车 流式响应(Chat):HTTP 响应体字节流的读取与解析 iPhone 截屏高效翻译 Flash Open Terminal iPhone 侧载安装 Xcode Symbolic Debug AI 指北 投资风险收益评估 Mac 快速修改系统快捷键 Git Record passkey How to pay apple frameworks Mac - Command Line Tools DNS 的 CNAME 是如何工作的 WebRTC 的一些解释 SSE 指南 1.1.1.1、WARP 和 MASQUE 移动端换端方案与场景还原 设备发现 分辨率 - 像素密度 - HiDPI Mac 字体 ESP32 trump - 川普 币圈 - 虚拟货币 【旅游】富士山 【旅游】sakura(樱花) 【旅游】千岛湖 我的 2023 【Swift】中文词语纠错 计算机字符编码与内存编码 - Unicode、UTF8、String 从汇编角度理解 “函数调用栈” 和 “有栈协程” 通过 Swift Package 制作二进制库 Arc 浏览器 - 意外的惊喜 【Swift 三方源码 1】SwiftShell 高效的命令行工具 Swift 脚本开发环境搭建 rime - 小鹤双拼 【旅游】沿海旅游 (威海、青岛) 好记性远远不如烂笔头 高级语言小记 又一年高考 Vision 未来已来 致敬耗子哥 Socket 与 ICMP 对互联网隐私的一些想法 网络代理是如何工作的 (致敬 Surge) 又十年 - 至三十而立 双拼 - 少有的高回报效率技能 Vim 技巧 我的 2022 三年疫情五味杂陈 - 下 老梗 - 浏览器按回车后发生了什么 三年疫情五味杂陈 生活推荐清单 Shell 和进程 有计划的努力 内卷 不确定性 数学可以保障逻辑自洽 这些年我的软件清单 决定做一些改变 函数调用栈之彻底理解 锁 - 共享数据安全指↑ 江苏女有感 碎碎念 - 2022 碎碎念 - 2021 打算记录一些碎碎念 多重性格就是逆天改命 从 Core Foundation 看更大世界 TCP 数据传输过程分析 iOS main 文件中的 @autoreleasepool 的真实用途 多线程的难点在哪里 Objective-C 和 Runtime 早起打卡计划 ing 打比方 IM 和 Socket 的关系及 Heart 的必要性 如果我的人生突然只剩下 8 小时... 胡说八道之雪粉 Array 和 LinkedList 的深刻认知 Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用 逃离信用卡和花呗 Swift_let_var_struct_class 网聚人的力量 - 网易 绿皮火车 喝酒十之八九会误事 HKong 胡说八道之云服务 互联网网络传输协议理解坑点 CPU 的制作 我心里一直有一个念想 网络基础协议 为什么 32 位操作系统只能用 4G 内存空间 努力和天赋 洗牙 RAC-Api-Summer iOS 内存原理 Block 闭包简查记录 《白夜行》 谈谈事件驱动 老博新开 祭首
在 Xcode 中更好的使用 Swift
海驴 · 2023-12-15 · via 一个工匠

在 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 进行一些调教。
目标是快速查阅继承、搜索、实现协议方、三方库文档等代码阅读操作。

0x01 搜索快捷治理

vscode 的搜索是出奇的快和方便查阅。很喜欢做的一件事情,是把公司几百个仓库 down 下来,通过 vscode 搜索要抄的作业。这时候通过搜索简短的注释级别的语意,就能找到期望的代码片段,AI 都得落泪。

对于 xcode,感觉就像老人,多操作几个功能就菊花圈转啊转的。搜索符号、文本的时候也经常有卡顿。可能是电脑太差了吧。
最近把搜索切到快捷键后,感觉快了很多。这应该是不用鼠标操作 UI,避免了主线程的卡顿。xcode 中主线程易卡死,最烂 IDE 不是吹的。

新增的快捷搜索如下:

1
2
3
4
5
6
⌥C  ->  Find Call Hierarchy
⌥A -> Find Ancestor Types
⌥C -> Find Conforming Types
⌥D -> Find Descendent Types
⌥S -> Find Selected Symbol in Workspace
⌥T -> Find Selected Text in Workspace

在 setting - Key Bindings - filter【find】进行修改,使用 Option 做前缀,这样不会产生快捷键冲突。后缀使用语意单词的首字母,方便记忆。
在需要搜索的单词上按下快捷键,就可以切到 搜索 区域展示搜索结果了(无需全选单词,xcode 默认会做单词内容全选)。

对其中的几个搜索做下介绍:
Find Ancestor Types: 展示当前 class 的逐个父类 (祖先类)。其中,协议也属于祖先类,会一并展示。
Find Descendent Types: 和上一个相反,展示子类。不过无法展示协议的实现类。和上一个有差异。
Find Conforming Types: 展示当前协议的实现类。其中若 A 协议继承 B 协议,搜索 B 也会将 A 展示出来。
Find Selected Symbol in Workspace: 根据符号进行搜索,相比文本搜索会更准确。如 函数、属性 的搜索,直接展示所有使用方。

这几个快捷键,基本覆盖找代码过程中的大部分场景。里面还有一些小技巧,如前后缀及单词匹配、大小写敏感、展示方法和属性等。

缺陷

对于 Procotol,若 ProtocolB 继承 ProtocolA。无法通过以上 Find 操作从 ProtocolB 找到其祖先协议 ProtocolA。这是 Xcode 的缺陷。
这个有一个补救的办法,是通过下面说到的 DocC 来查阅。DocC 文档的末尾,一般有一个 Conformed to 列表,用于标记当前 Procotol 实现了哪些祖先 Protocol。

技巧 1 Xcode Index

对于 ⌥T 文本搜索,任何条件下使用都没有问题。但是其他的搜索如符号、祖先等,就需要 xcode 先解析项目生成 Index 索引,然后才能通过读取 db 缓存来使用。
这里的解析项目,是不需要编译通过的。只需要 Xcode 把项目的词法分析操作完即可 (默认打开项目就会解析)。

但这里也会有一个小问题,就是多个 Group 下有大量无法编译通过的文件,Index 索引生成会失败。
这时候可以通过新建 Target,将文件添加到不同的 Target 中。可以解决 Index 索引失效问题。

技巧 2 Scheme 去除干扰

Xcode Index 中描述,对于有些项目,如 github 源码、自己建立的测试工程等,某些原因下可能无法编译通过。
这个时候项目里面会有很多 error,使用搜索的时候,会有很多刺眼的红色警告条干扰。

这个时候可以操作 Manager Schemes - show,将所有 scheme 取消勾选。因为 xcode 已经把项目解析完成,搜索依旧是可以使用的。这样可以有效的去除警告干扰。

技巧 3 Search Scopes

巧妙设置 Scopes,可以大范围缩小部分文本的搜索范围。搜索范围可以设置为部分主项目文件夹和任意三方库的关联。
有个小技巧,是按着 Control 选中需要搜索的文件夹或者三方库,然后右键,会有一个快捷添加 Scopes 的入口。

技巧 4 正则搜索

配合 ChatGPT 写正则搜索,也非常棒。如果需要对正则结果使用文本替换功能 (replace),最好在 vscode 里面操作,效果会更好。

0x02 Swift 官方源码

上面说到的搜索,仅仅对于有源码的当前项目或者三方库进行使用。Swift Foundation 等模块,只能通过其生成的 api 接口来预览。
这个时候弊端非常明显,就是很难查找当前一个系统类的父子及实现协议之间的关系 (如:想要查看 Array 实现了哪些 Protocol 以及父子类)。

因为 Swift 是开源的,这里一个办法是直接获取 Swift 源码。具体方法可以参考这篇文章。swift-5.9 - RELEASE 源码编译(Xcode)

整套流程非常耗费时间和磁盘大小 (62.5G),若非查看 cpp 实现源码,可通过 lite 版本进行 swift 源码查阅 swift5.9.2_rawcode_lite
当然,cpp 源码包含非常多的有价值内容。如 LLVM 项目中有整套编译器和平台架构的实现。Swift 项目中有对 ELF/Mach-0 Image 等详细操作流程的实现。

0x03 使用 Assistant 视图

在编辑窗口使用默认快捷键 ⌃⌥⌘↩ 可打开 Assistant 视图。在做 Storyboard / SwiftUI 等 UI 面板开发的时候经常用里面的 auto 功能以打开对应源码文件。
其中还有一些如 Procotol/extension/superclass 等,毕竟方便展示当前打开页面的清单。

尤其里面有一个 interface 能力,可以展示当前 swift 源码对应的头文件。这样可以边看源码边看接口定义,非常方便。

0x04 首选 DocC 文档

苹果开放了 DocC 能力,可以快速输出任意项目 / 三方库的接口文档。具有和官方文档一样的体感,非常好用。

DocC 文档可通过 ⇧⌘0 快捷键快速体验。通过 Product - Build Documentation 可快速输出项目接口文档。

0x05 Bookmark

新版 xcode (15) 增加了书签 Bookmark 功能。可以在文本任意行右键找到入口,在搜索面板的左侧找到书签总入口。

以前,都是通过打断点然后把该断点设置取消状态的方案,在断点总入口里面刻意做到标记。把断点当书签用。
现在有了单独的书签,展示上也更加友好。这些 IDE 必备的功能,虽迟但到吧。

0x06 加餐:vim

xcode 自建了 vim 的支持。vim 对中文场景一直有诟病,切换输入法的瞬间秒变灾难。vscode / 终端 均是如此。
但是 xcode 完美支持中文。在普通状态中文场景下,按键会自动表意为英文并执行对应的命令,不会变灾难。
xcode 是我见过的对 vim 支持最友好的 IDE。

如今,我经常中文写作,对于 md 文档也希望通过 xcode 来管理。我的方案是这样的:

  1. 建立一个命名为 EditBlog 的 workspace 和 library,这样可以提供一个最小化的 xcode 项目模版。
  2. 将 md 文档的文件夹设置 alias,并将 alias 放置于 EditBlog 项目中。在 Xcode 里面操作 add files to EditBlog (不选中 target,不选中 copy,使用 folder reference)。这样就完全将 md 文档接入到 xcode 工程里面了。
  3. 如果误操作了 xcode 的什么项目快捷键,当前工程也不会有什么错误响应。最主要的是什么时候想写字了,就即可。

优点:

  1. 实时同步。xcode 里面可以实时创建新 md。若外部创建了新 md,xcode 里面也会同步展示出来。(不选中 target,不选中 copy,使用 folder reference)
  2. 打开项目方便。打开 xcode,通过 recent 打开 EditBlog 项目即可。
  3. 快捷键误操作,不会触发什么 error。因当前 xcode 项目是最小化的模版,且 md 没有链接到 target 中。

自然增长即无刻意操作情况下,自然能达到的数量级。

一个千万级日活的 app,新增一个重要的功能入口。
那么如何评估这个功能的数据是否优秀,不能看 UV 或者 DAU。即使什么都不做,这个量级的用户基数也会有上百万的点击。

这对国家层面数据指标的鉴别也有重要参考,因为这里的基数更大。正向数据表达的可能是增长,也可能是降低。