Swift 结构化并发
Sep 28, 2021, 8:50 PM
本文是我的新书《Swift 异步和并发》中的部分内容,介绍了关于 Swift 中结构化并发的相关概念。如果你对学习 Swift 并发的其他话题有兴趣,也许这本书可以作为参考读物。 async/await 所引入的异步函数的简单写法,可以在暂停点时放弃线程,这是构建高并发系统所不可或缺的。但是异步函数本身,其实并没有解决并发编程的问题。结构化并发 (structured concurrency) 将用一个高效可预测的模型,来实现优雅的异步代码的并发。 什么是结构化 “结构化”...
Swift 并发初步
Jun 30, 2021, 10:00 PM
本文是我的新书《Swift 异步和并发》中第一章内容,主要从概览的方向上介绍了 Swift 5.5 中引入的 Swift 并发特性的使用方法。如果你对学习 Swift 并发有兴趣,也许可以作为参考读物。 你可以在这里找到本文中的参考代码。在本文写作的 Xcode 13 beta 2 环境下,你需要额外安装最新的 Swift 5.5 toolchain 来运行这些代码。 虽然可能你已经跃跃欲试,想要创建第一个 Swift...
用树莓派打造一个超薄魔镜的简单教程
Apr 25, 2021, 10:00 AM
本来买了一个树莓派打算架个 Nextcloud,实际弄好以后发现并不是很用得上。眼看新买的树莓派就要沦为吃灰大军中的一员,实在不甘心。正好家里有一面穿衣镜,趁机改造一下,做成了一个 Magic Mirror,最终效果如下。 有一些朋友好奇是怎么做到的,也会想要自己动手做一个类似的。这篇文章里我简单把这个镜子用到的材料、一些基本步骤和自己遇到的一些坑记录下来,通过说明整个过程,为大家提供参考。...
SwiftUI 中的 Text 插值和本地化 (下)
Mar 25, 2021, 11:00 PM
在上篇中,我们已经看到为什么 Text,或者更准确地说,LocalizedStringKey,可以接受 Image 和 Date,而不能接受 Bool 或者自定义的 Person 类型了。在这下篇中,让我们具体看看有哪些方法能让 Text 支持其他类型。 为 LocalizedStringKey 自定义插值 如果我们只是想让 Text 可以直接接受 true 或者 false,我们可以简单地为加上 appendInterpolation 的 Bool 重载。 1 2 3 4...
SwiftUI 中的 Text 插值和本地化 (上)
Mar 25, 2021, 6:00 AM
Text 中的插值 Text 是 SwiftUI 中最简单和最常见的 View 了,最基本的用法,我们可以直接把一个字符串字面量传入,来创建一个 Text: 1 Text("Hello World") 在 iOS 14 (SwiftUI 2.0) 中,Apple 对 Text 插值进行了很多强化。除了简单的文本之外,我们还可以向 Text 中直接插入 Image: 1 Text("Hello \(Image(systemName: "globe"))")...
关于 SwiftUI State 的一些细节
Jan 22, 2021, 1:00 AM
2021 年 9 月更新 在评论区里,@CrystDragon 指出原文章的部分 内容已经在新版本 SwiftUI 中发生了变化。不过这也带来了另一方面更加让人迷惑的问题。因此我对部分内容进行了更新和额外说明,更新部分会作为评注内 容写在相关原文的后面。 @State 基础 在 SwiftUI 中,我们使用 @State 进行私有状态管理,并驱动 View 的显示,这是基础中的基础。比如,下面的 ContentView 将在点击加号按钮时将显示的数字 +1: 1 2 3 4...
迟到的 2020 年终总结
Jan 4, 2021, 4:50 AM
岁月如梭,白驹过隙。年前就打算写的这篇 2020 年终总结,硬生生被拖成了 2021 的“去年回顾”。主要还是因为思前想后,觉得 2020 年实在太过特殊:在 2020 经历的事情,也许今后很长一段时间都不会再有;于是在 2020 总结的经验,似乎也很难运用于未来。不过就算如此,还是勉强写点儿什么,权当留个纪念吧。 关于疫情...
使用 Property Wrapper 为 Codable 解码设定默认值
Nov 10, 2020, 12:00 AM
本文介绍了一个使用 Swift Codable 解码时难以设置默认值问题,并利用 Property Wrapper 给出了一种相对优雅的解决方式,来在 key 不存在时或者解码失败时,为某个属性设置默认值。这为编解码系统提供了更好的稳定性和可扩展性。最后,对 enum 类型在某些情况下是否胜任进行了简单讨论。 示例代码 Codable 类型中可选值的窘 (囧?) 境 基础类型可选值 Codable 的引入极大简化了 JSON 和 Swift...
Swift 中使用 Option Pattern 改善可选项的 API 设计
Oct 21, 2020, 1:00 AM
SwiftUI 中提供了很多“新颖”的 API 设计思路和 Swift 的使用方式,我们可以进行借鉴,并反过来使用到普通的 Swift 代码中。PreferenceKey 的处理方式就是其中之一:它通过 protocol 的方式,为子 view 们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父 view 去。如果有机会,我会再专门介绍 PreferenceKey,但这种设计的模式其实和 UI 无关,在一般的 Swift 里,我们也能使用这种方法来改善 API...
Package.swift toolchain 版本的选择
Sep 4, 2020, 11:00 PM
WWDC 2020 上 Swift Package Manager (SPM) 开始支持 Resource bundle 和 Binary Framework。对于 Package 的维护者来说,如果有需求,当然是应该尽快适配这些内容。首先要做的,就是将 Package.swift 中的 Swift Toolchain 版本改到最新的 5.3:只有最新的 tool chain 才具备这些功能。 1 // swift-tools-version:5.3...
@StateObject 和 @ObservedObject 的区别和使用
Jun 24, 2020, 11:00 PM
WWDC 2020 中,SwiftUI 迎来了非常多的变更。相比于 2019 年的初版,可以说 SwiftUI 达到了一个相对可用的状态。从这篇文章开始,我打算写几篇文章来介绍一些重要的变化和新追加的内容。如果你需要 SwiftUI 的入门和基本概念的材料,我参与的两本书籍《SwiftUI 与 Combine 编程》和《SwiftUI 编程思想》依然会是很好的选择。 字太多,不想看,长求总 @ObservedObject 不管存储,会随着 View 的创建被多次创建。而...
一些关于 App Clips 的笔记
Jun 22, 2020, 11:00 PM
App clips 是今天 WWDC 上 iOS 14 的一个重要“卖点”,它提供了一种“即时使用”的方式,让用户可以在特定时间、特定场景,在不下载完整 app 的前提下,体验到你的 app 的核心功能。 装好 Xcode 12 以后第一时间体验了一下如何为 app 添加 app clip。它的创建和使用都很简单,也没有什么新的 API,所以要为 app 开发一个 clip...
使用 protocol 和 callAsFunction 改进 Delegate
Mar 11, 2020, 9:00 PM
在 Combine 中实现自定义 Publisher
Jan 19, 2020, 8:00 PM
本文是对我的《SwiftUI 和 Combine 编程》书籍的补充,对一些虽然很重要,但和书中上下文内容相去略远,或者一些不太适合以书本的篇幅详细展开解释的内容进行了追加说明。如果你对 SwiftUI 和 Combine 的更多话题有兴趣的话,可以考虑参阅原书。
上一篇文章里,我们探索了 Combine 里对 back pressure 的处理。在那边,主要涉及到的是实现自定义的 Subscriber,来通过控制事件流终端的 pull 行为,实现合理的 back...
2019 年终总结
Dec 31, 2019, 12:22 AM
距离上一次写年终总结已经过去四年时间了。在人生中带上两个小朋友以后,远游这种事情的难度就高企不下了。一年里除了工作以外,活动的轨迹多半也都落在了以家为圆心两公里为半径的圆周里。看着小朋友们一天天长大,在被她们的想象力和好奇心折服的同时,也不可避免地感觉到了自己的“成熟”…嗯,或者直白些,不可避免地感觉到了自己在变老。
对我来说,2019...
关于 Backpressure 和 Combine 中的处理
Nov 30, 2019, 10:32 PM
本文是对我的《SwiftUI 和 Combine 编程》书籍的补充,对一些虽然很重要,但和书中上下文内容相去略远,或者一些不太适合以书本的篇幅详细展开解释的内容进行了追加说明。如果你对 SwiftUI 和 Combine 的更多话题有兴趣的话,可以考虑参阅原书。
Combine 在 API 设计上很多地方都参考了 Rx 系,特别是 RxSwift 的做法。如果你已经对响应式编程很了解的话,从 RxSwift 迁移到 Combine 应该是轻而易举的。如果要说起...
SwiftUI 的一些初步探索 (二)
Jun 10, 2019, 11:32 PM
我已经计划写一本关于 SwiftUI 和 Combine 编程的书籍,希望能通过一些实践案例帮助您快速上手 SwiftUI 及 Combine 响应式编程框架,掌握下一代客户端 UI 开发技术。现在这本书已经开始预售,预计能在 10 月左右完成。如果您对此有兴趣,可以查看 ObjC 中国的产品页面了解详情及购买。十分感谢!
接上一篇继续对 SwiftUI 的教程进行一些解读。
教程 2 - Building Lists and...
SwiftUI 的一些初步探索 (一)
Jun 4, 2019, 2:32 AM
我已经计划写一本关于 SwiftUI 和 Combine 编程的书籍,希望能通过一些实践案例帮助您快速上手 SwiftUI 及 Combine 响应式编程框架,掌握下一代客户端 UI 开发技术。现在这本书已经开始预售,预计能在 10 月左右完成。如果您对此有兴趣,可以查看 ObjC 中国的产品页面了解详情及购买。十分感谢!
总览
如果你想要入门 SwiftUI 的使用,那 Apple...
Swift ABI 稳定对我们到底意味着什么
Feb 20, 2019, 8:28 PM
Swift 社区最近最重大的新闻应该就是 ABI 稳定了。这个话题虽然已经讨论了有一阵子了,但随着 Xcode 10.2 beta 的迭代和 Swift 5 的 release 被提上日程,最终 Swift ABI 稳定能做到什么程度,我们开发者能做些什么,需要做些什么,就变成了一个重要的话题。Apple 在这个月接连发布了 ABI Stability and More 和 Evolving Swift On Apple Platforms After ABI...
与 JOSE 战斗的日子 - 写给 iOS 开发者的密码学入门手册 (实践)
Dec 6, 2018, 8:28 PM
概述
这是关于 JOSE 和密码学的三篇系列文章中的最后一篇,你可以在下面的链接中找到其他部分:
基础 - 什么是 JWT 以及 JOSE
理论 - JOSE 中的签名和验证流程
实践 - 如何使用 Security.framework 处理 JOSE 中的验证 (本文)
这一篇中,我们会在 JOSE 基础篇和理论篇的知识架构上,使用 iOS (或者说 Cocoa) 的相关框架来完成对 JWT 的解析,并利用 JWK...