• 博客暂时停更通知

    • Blog
    • 发布于2022年01月24日

    我的博客【肘子的Swift记事本】已经上线 2 年了。撰写博客的初衷是想通过文字来记录自己的学习的过程、加深理解并将所得分享给其他的朋友。越是撰写新的内容,越能够发现自己的不足。作为一个编程爱好者,我深知自己的基础知识相当薄弱,又该进行系统性充电了。同去年上半年停更的原因一样,我打算用一段完整的时间来充实自己,并将自己近来的学习所得通过实践的形式得以消化。

  • 在 Core Data 中查询和使用 count 的若干方法

    在 Core Data 中,开发者经常需要面对查询记录数量(count),使用 count 作为谓词或排序条件等需求。本文将介绍在 Core Data 下查询和使用 count 的多种方法,适用于不同的场景。

  • 在 SwiftUI 下定制手势

    不同于众多的内置控件,SwiftUI 没有采用对 UIGestureRecognizer(或 NSGestureRecognizer)进行包装的形式,而是重构了自己的手势体系。SwiftUI 手势在某种程度上降低了使用门槛,但由于缺乏提供底层数据的 API,严重制约了开发者的深度定制能力。在 SwiftUI 下,我们无法拥有类似构建全新 UIGestureRecongnizer 的能力。所谓的自定义手势,其实只是对系统预置手势的重构而已。本文将通过几个示例,演示如何使用 SwiftUI 提供的原生手段定制所需手势。

  • 玩转 Xcode Playground(上)

    本系列将介绍大量有关 Xcode Playground 的使用技巧,涉及稳定性、第三方库、资源管理、异步处理、文档标注等等方面,让你玩转 Playground,使其成为你工作学习中的利器。

  • Swift Playgrounds 4 娱乐还是生产力

    赶在 2021 年底,苹果终于发布了 Swift Playgrounds 4,作为近年来最具革命性意义的版本,Swift Playgrounds 4 提供了在 iPad 上开发可发行 app 的能力。本文将对 Swift Playground 4 的新功能做以介绍,并探讨将其作为开发工具的可行性。

  • 聊聊 Combine 和 async/await 之间的合作

    本文来聊聊 Combine 和 async/await 它们之间各自的优势、是否可以合作以及如何合作等问题。在 Xcode 13.2 中,苹果完成了 async/await 的向前部署(Back-deploying)工作,将最低的系统要求降低到了 iOS 13(macOS Catalina),这一举动鼓舞了越来越多的人开始尝试使用 async/await 进行开发。当大家在接触了异步序列(AsyncSequence)后,会发现它同 Combine 的表现有些接近,尤其结合近两年 Combine 框架几乎没有什么变化,不少人都提出了疑问:苹果是否打算使用 AsyncSequence 和 AsyncStream 替代 Combine。

  • SwiftUI 视图的生命周期研究

    本文将作者对 SwiftUI 视图、SwiftUI 视图生命周期的理解和研究做以介绍,供大家一起探讨。在 UIKit(AppKit)的世界中,通过框架提供的大量钩子(例如 viewDidLoad、viewWillLayoutSubviews 等),开发者可以将自己的意志注入视图控制器生命周期的各个节点之中,宛如神明。在 SwiftUI 中,系统收回了上述的权利,开发者基本丧失了对视图生命周期的掌控。不少 SwiftUI 开发者都碰到过视图生命周期的行为超出预期的状况(例如视图多次构造、onAppear 无从控制等)。

  • 掌握 SwiftUI 的 Safe Area

    Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供的视图重叠的内容空间。本文将探讨如何在 SwiftUI 中获取 SafeAreaInsets、将视图绘制到安全区域之外、修改视图的安全区域等内容。

  • 关于 Core Data 并发编程的几点提示

    Swift 5.5 提供了盼望已久的 async/await 的功能,为多线程开发带来了前所未有的便利。但 Core Data 由于其特有的并发规则,使用不慎容易导致代码陷入不可控状态,因此让不少开发者对在 Core Data 中进行多线程开发产生了望而却步的情绪。本文将对 Core Data 并发编程中几个常见的问题予以提示,以便开发者更好地了解 Core Data 的并发规则,充分享受 Core Data 提供的强大功能。

  • 掌握 Core Data Stack

    或许觉得比较枯燥,亦或许感觉 Xcode 提供的模版已经满足了使用的需要,很多 Core Data 的使用者并不愿意在 Core Data Stack 的了解和掌握上花费太多的精力。这不仅限制了他们充分使用 Core Data 提供的丰富功能,同时也让开发者在面对异常错误时无所适从。本文将对 Core Data Stack 的功能、组成、配置等做以说明,并结合个人的使用经验聊一下如何设计一个符合当下需求的 Core Data Stack。本文并不会展示一个完整的创建代码,更多是原理、思路和经验的阐述。

  • 了解 SwiftUI 的 onChange

    从 iOS 14 开始,SwiftUI 为视图提供了 onChange 修饰器,通过使用 onChange,我们可以在视图中对特定的值进行观察,并在其更改时触发操作。本文将对 onChange 的特点、用法、注意事项以及替代方案做以介绍。

  • 如何在 Core Data 中使用 Derived 和 Transient 属性

    使用过 Core Data 的开发者,一定会在编辑 Data Model 时看到过右侧的属性面板中的 Derived 和 Transient 两个属性。关于这两个属性的文档不多,大多的开发者并不清楚该如何使用或在何时使用该属性。文本将结合我的使用体验,对 Derived 和 Transient 两个属性的功能、用法、注意事项等内容作以介绍。

  • 聊聊两年来我使用【健康笔记】的体会以及近几年的身体状况

    2019年中,我有了开发用于记录自己健康数据app的想法,并在同年10月完成了【健康笔记】第一个很简陋的版本。到今天,我已经使用健康笔记两年了。从记录的数据来看,手术后这几年身体的各项指标还算保持的不错,尽管并没有达到非常理想的状态,但同我个人之前的指标比较,已经改善太多,希望能够长期保持下去。

  • SwiftUI TextField 进阶——格式与校验

    SwiftUI 的 TextField 可能是开发者在应用程序中最常使用的文本录入组件了。作为 UITextField(NSTextField)的 SwiftUI 封装,苹果为开发者提供了众多的构造方法和修饰符以提高其使用的便利性、定制性。但 SwiftUI 在封装中也屏蔽了不少的高级接口和功能,增加了开发者实现某些特定需要的复杂性。本文为【SwiftUI 进阶】系列文章中的一篇,在本文中,我将介绍如何在 TextField 中实现如下功能:屏蔽无效字符、判断录入的内容是否满足特定条件、对录入的文本实时格式化显示。

  • AttributedString——不仅仅让文字更漂亮

    在 WWDC 2021 上,苹果为开发者带来了有一个期待已久的功能——AttributedString,这意味着 Swift 开发人员不再需要使用基于 Objective-C 的 NSAttributedString 来创建样式化文本。本文将对其做全面的介绍并演示如何创建自定义属性。

  • 如何对 iOS 应用中的文本进行本地化

    当我们使用一个英文 app 时,很多人第一时间会去查看是否有对应的中文版本。可见,在 app 中显示让使用者最亲切的语言文本是何等的重要。对于相当数量的 app 来说,如果能够将 UI 中显示的文本进行了本地化转换,基本上就完成了 app 的本地化工作。本文中,我们将探讨 iOS 开发中,如何实现显示文本的本地化工作。

  • 用 NavigationViewKit 增强 SwiftUI 的导航视图

    由于 SwiftUI 原生提供的导航手段能力有限,因此在之前的版本中,NavigationView 总是使用的不是那么的顺手。本文介绍一个我写的针对 NavigationView 的扩展库——NavigationViewKit。为原生 NavigationView 解决几个当前的痛点问题。

  • 在 SwiftUI 中使用 UIKit 视图

    本文将通过对 UITextField 的包装来讲解如何在 SwiftUI 中使用 UIKit 视图、如何让你的 UIKit 包装视图具有 SwiftUI 风格、在 SwiftUI 使用 UIKit 视图需要注意的地方

  • 博客更新记

    上个周末,我将博客进行了一番装修升级。我对本次更新的效果比较满意,并非博客变得多好,而是通过此次更新,让我对当今的 Web 技术有了一定的了解。同时在本次更新过程中,无论是调试 Swift 代码、CSS 代码还是 Markdown 文档,都是在 Visual Studio Code 中进行的,这也让我对 Visual Studio Code 有了进一步的认识和掌握。

  • Core Data with CloudKit (一) —— 基础

    介绍如何使用 NSPersistentContainer 的文章并不少,但同其他 Core Data 的功能一样,用好并不容易。在两年多的使用中,我便碰到不少问题。借着今年打算在【健康笔记 3】中实现共享数据库功能的机会,我最近较系统地重新学习了 Core Data with CloudKit 并对其知识点进行了梳理。希望通过这个系列博文能让更多的开发者了解并使用 Core Data with Cloudkit 功能。

  • @AppStorage 研究

    本文探讨的是如何优雅、高效、安全地在 SwiftUI 中使用@AppStorage,在不借助第三方库的情况下,解决当前@AppStorage 使用中出现的痛点

  • 在 CoreData 中使用持久化历史跟踪

    本文介绍了 CoreData 的 Persistent History Tracking 功能。详细讲解了从响应、提取、合并到清除的全过程处理方式,并提供了演示代码供读者使用。

  • WWDC 2021 观后感

    • WWDC
    • 发布于2021年06月18日

    WWDC 2021 转眼间已经结束一周了。本次 WWDC 苹果一如既往的带来了新的操作系统以及一大堆开发工具、软件架构、网络服务等方面的升级。由于疫情的原因,这两年的 WWDC 都是采用录播形式,不过从视频内容上看,反倒比以前传达地更加精准,对观看者也更加地友善。本文仅从我个人感兴趣的几个角度进行一点介绍,并结合这段时间的学习谈谈使用感受。

  • 用 Publish 创建博客(三)——插件开发

    我们不仅可以利用 Publish 内置的接口来开发插件进行扩展,同时还可以使用 Publish 套件中其他的优秀库(Ink、Plot、Sweep、Files、ShellOut 等)来完成更多的创意。本文将通过几个实例(添加标签、增加属性、用代码生成内容、全文搜索、命令行部署)在展示不同扩展手段的同时向大家介绍 Publish 套件中其他的优秀成员。

  • 用 Publish 创建博客(二)——主题开发

    拥用强大的主题系统是一个静态网站生成器能否成功的重要原因之一。Publish 采用 Plot 作为主题的开发工具,让开发者在高效编写主题的同时享受到了 Swift 的类型安全的优势。本文将从 Plot 开始介绍,让读者最终学会如何创建 Publish 主题。

  • 用 Publish 创建博客(一)——入门

    Publish 是一款专门为 Swift 开发者打造的静态网站生成器。它使用 Swift 构建整个网站,并支持主题、插件和其他大量的定制选项。 本文包含 Publish 的快速使用入门以及基本结构说明。

  • 在 SwiftUI 下对 iPad 进行适配

    SwiftUI 创建初衷之一便是可以高效、可靠的适配多个苹果的硬件平台。在健康笔记 2.0 开发初始,适配 iPad 便是我本次的设计目标之一。本文并非教程,只是我在进行本次开发中,对于适配 iPad 的一些教训和心得。

  • 健康笔记 2.0 开发随笔(六)

    一晃国庆中秋长假即将结束,距离上次的随笔也有了一段时间。在最近的日子里,我一方面继续着开发的进程,同时还要付出相当的精力同 iOS14 中的各种 Bug 和异常斗智斗勇。本篇随笔主要记录了这段时间碰到的一些问题,以及聊聊 iOS14、Xcode12 以及 SwiftUI2.0 的一些优缺点。想到哪、写到哪,可能逻辑会比较混乱。

  • 健康笔记 2.0 开发随笔(五)

    一晃国庆中秋长假即将结束,距离上次的随笔也有了一段时间。在最近的日子里,我一方面继续着开发的进程,同时还要付出相当的精力同 iOS14 中的各种 Bug 和异常斗智斗勇。本篇随笔主要记录了这段时间碰到的一些问题,以及聊聊 iOS14、Xcode12 以及 SwiftUI2.0 的一些优缺点。想到哪、写到哪,可能逻辑会比较混乱。

  • 健康笔记 2.0 开发随笔(四)

    本周没有太多的精力和情绪用来写代码。这两天在原来统一 sheet 管理和实时 Form 的基础上,完成了可以控制取消手势的 Sheet。这个是 SwiftUI 中一直以来的一个重要的缺失功能。 在 SwiftUI 中制作可以控制取消手势的 Sheet

  • 在 SwiftUI 中制作可以控制取消手势的 Sheet

    在前面的两篇文章中,我们探讨了如何制作一个可以判断是否进行了修改的表单,以及如何统一管理 app 各个层级 View 的弹出 Sheet。今天我们将他们合并在一起,完成整个项目的最终目的——在 Sheet 中制作一个可以实时响应的表单,并且 sheet 会感觉表单的情况响应取消手势。

  • 如何在 SwiftUI 中创建一个实时响应的 Form

    我的 app 健康笔记主要是对数据的收集、管理,所以对于表单的实时检查、响应的要求比较高。因此制作一个对用于输入响应及时、反馈准确的 Form 十分重要。本文尝试提出一个 SwiftUI 下的 Form 开发思路。

  • 在 SwiftUI 中,根据需求弹出不同的 Sheet

    Sheet 是一个我比较喜欢的交互形式,它可以很好的控制用户的操作行为,让用户的交互逻辑单线条化。在 iOS14 上,SwiftUI 增加了 fullCover,支持了全屏的 Sheet 方式,让开发者又了更多的选择。

  • 健康笔记 2.0 开发随笔(一)

    健康笔记从 2020 年 1 月上线以来,至今已经过了大半年的时间(可以从 [老人新兵 —— 一款 iOS app 的开发手记](https://zhuanlan.zhihu.com/p/103822455) 了解健康笔记 app 的由来)。在这段时间里,我对于 Swift、SwiftUI、CoreData 等都有了进一步的了解和认识。在开发 1.0 版本时所面对的问题和疑惑多数都得到了解决。

  • 用 SwiftUI 实现 iOS mail 程序的侧滑菜单

    随着 SwiftUI2.0 的不断完善,我觉得是时候将我的 app 做一个较大的升级了。之前一直想在 app 中实现类似 iOS 邮件程序那样优雅的侧滑菜单效果,在网上也找了一下,实现的较好的是适用于 UIKit 的,基本上没有能够很好的适配 SwiftUI 的项目库。最终自己在 Xcode12 实现了一个。

  • HowTo —— SwiftUI2.0 使用 ProgressView 显示进度条

    SwiftUI2.0 新增了一些便捷的内置控件,比如说 Label、ProgressView 等。其基本形态都很普通,不过都支持自定义 style。官方的意图也比较明显,通过内置控件,规范代码、提高原型编写速度,如需要更精细控制可通过扩展 style 来完成。

  • HowTo —— 使用 onOpenURL 处理 Universal Links

    SwiftUI2.0 由于可以采用新的代码架构(Life Cycle SwiftUI App)来组织 app, 因此提供了 onOpenURL 来处理 Univeresal Links。不同于在 AppDelegate 或 SceneDelegate 中的解决方案,onOpenURL 作为一个 view modifier,你可以在任意 View 上注册你的 app 的 URL 处理机制。

  • HowTo —— SwiftUI2.0 使用 ToolBar 替代 navigationbarItems

    SwiftUI2.0 为了实现更好的多平台支持同时需要兼顾 1.0 版本代码兼容性,提供了一些与已有控件功能上类似但名称和用法全新的控件。比如 ToolBar, navigationTitle 等。Toolbar 可以实现 navigationbarItems 的全部功能,并新增了在多平台下的适配。采用了全新的语法,代码更易阅读。

  • HowTO —— SwiftUI2.0 原生的 Grid

    SwiftUI 的第一版中,官方并没有提供 UICollectionView 的对应功能。开发者需要自行包装或者依赖很多第三方库。SwiftUI2.0 中,苹果通过 LazyVGrid、LazyHGrid 提供了 Grid 控件。该控件的实现很有 SwiftUI 的风格,和众多的第三方库有显著的区别。

  • SwiftUI2.0 —— App、Scene、新的代码结构(一)

    本文简单介绍了 SwiftUI2.0 中全新提供的 App 协议、Scene 协议,浅谈了在全新的代码结构下如何组织 Data Flow,并提供了 SwiftUI2.0 中预置的 Scene 的一些使用示例。当前运行环境为 Xcode Version 12.0 beta (12A6159), macOS Big Sur 11.0 Beta 版 (20A4299v)。

  • @FocusedBinding 浅谈

    在苹果 WWDC20 中视频中出现了下面的代码,介绍了一个新的属性包装器@FocusedBinding。由于仍处于测试阶段,当前的代码并不能被正确的执行。@FocusedBinding 的资料苹果披露的也很少,网上也没有相关的信息。出于个人兴趣,我对它进行了简单的研究。尽管@FocusedBinding 在目前 Xcode Version 12.0 beta 2 (12A6163b) 的版本上运行还有很多问题,但我基本上对其有了一定的了解。

  • SwiftUI2.0 —— Commands(macOS 菜单)

    本文介绍了 SwiftUI 2.0 中,如何为 macOS 平台添加菜单。苹果在 SwiftUI2.0 中增加了 Multiplatform 项目模板,使得同一套代码,仅需少量的适配便可以同时满足 iOS 以及 macOS 的需要。对于 macOS 上运行的 app, 拥有自定义的菜单是一个十分重要的平台特征。对于没有 macOS 开发经验的我来说,学习如何设计开发菜单变得十分有趣且必要。

  • SwiftUI 2.0 —— @StateObject 研究

    WWDC20 刚刚结束,在过去的一周,苹果为开发者带来了巨大的惊喜。由于新特性实在太多,需要不少时间来消化,我首先选择自己最感兴趣的内容进行一些简单的研究和探讨。本文首先浅谈一下 SwiftUI 新提供的属性包装器@StateObject。

  • ObservableObject 研究——想说爱你不容易

    本文主要研究在 SwiftUI 中,采用单一数据源 (Single Source of Truth) 的开发模式,ObservableObject 是否为最佳选择。是否可以在几乎不改变现有设计思路下进行新的尝试,以提高响应效率。最后提供了一个仍采用单一数据源设计思路但完全弃用 ObservableObject 的方式。

  • @state 研究

    本文试图探讨并分析 SwiftUI 中 @State 的实现方式和运行特征;最后提供了一个有关扩展@State 功能的思路及例程。读者需要对 SwiftUI 的响应式编程有基本概念。

  • Vapor4 的安装与配置

    • Vapor
    • 发布于2020年05月07日

    本文介绍了如何在 mac 10.5.4 和 ubuntu 18.04 下安装 Vapor 命令行工具,创建 Vapor 项目,简单的调试项目以及如何部署到生产环境的过程。文中的运行环境为:Vapor4,Swift5.2,Catalina 10.5.4,Ubuntu18.04