首页
沸点
课程
数据标注
HOT
AI Coding
更多
直播
活动
APP
插件
直播
活动
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
登录
注册
Swift学习专栏
unravel2025
创建于2022-11-28
订阅专栏
记录本人在学习Swift过程中的精彩文章或者各种小妙招等等,内容来自 https://www.swiftwithvincent.com/、https://sarunw.com/posts/、 等博客
等 121 人订阅
共173篇文章
创建于2022-11-28
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
Swift Continuations 完全指南:一口气弄懂 4 种“桥梁”
一、为什么需要 Continuations? Swift 5.5 带来 async/await,但: 老 SDK / 三方库仍用回调 自己封装的 DispatchQueue、Timer、Notific
深入理解 SwiftUI 的 Structural Identity:为什么“换个条件分支”就会丢状态?
什么是 Structural Identity? SwiftUI 通过结构身份(Structural Identity)判断新旧视图树中的同一个节点: 类型相同 在层级中的位置相同 祖先链的身份相同
Swift 的 `withoutActuallyEscaping`:借一个 `@escaping` 身份,但不真的逃跑
一、为什么会有“假逃跑”需求? 默认情况下,函数参数的闭包是 non-escaping: 只能在函数体内同步调用 编译器可把闭包放在栈上,更快、无堆分配 但某些标准库 API(lazy.filter、
Opaque Types 完全指南:Swift 的“密封盒子”魔法
一、什么是 Opaque Type? 一句话:“函数返回一个具体类型,但调用者只能看到它遵守的协议。” 语法: some View 就是不透明返回类型(opaque return type)。 编译器
Thread.sleep vs Task.sleep:一句话记住“别再阻塞线程”
一、两句话区分 API 阻塞谁 后果 Thread.sleep(forTimeInterval:) 整条线程 线程池“饿死”,其他任务无法调度 Task.sleep(nanoseconds:) 当前任
强制 SwiftUI 重新渲染:`.id()` 这把“重启键”你用对了吗?
为什么需要“强制 reload”? SwiftUI 的声明式 DSL 依赖 状态 diff 自动更新视图,但以下场景需要“硬重启”: 网络请求失败后的“重试”按钮 图片/视频加载损坏,需重新解码 底层
Swift 6.2 新语法糖:在字符串插值里直接给 Optional 写默认值
一句话看懂新特性 旧写法(nil-coalescing) 新写法(Swift 6.2 插值默认值) 异类型痛点:旧语法搞不定 省去了手动 .map(String.init) ?? "Unknown"
窥探 `@Observable` 的“小黑盒”:private 属性到底会不会被观察?
问题抛出 直觉:private = 对外隐藏 = 不生成观察代码? 真相:除非加 @ObservationIgnored,否则一律观察,与可见性无关! 验证工具:SIL(Swift Intermedi
Swift 并发避坑指南:自己动手实现“原子”属性与集合
为什么需要“原子”操作? Swift 没有现成的 atomic 关键字。当多个线程/任务同时读写同一属性或集合时,会出现: 读到中间状态(数组越界、字典重复 key) 丢失更新(值类型复制-修改-写回
惊!只是 `import Foundation`,`String.contains("")` 的返回值居然变了?
两行代码,两种结果 是否 import Foundation "".contains("") "abc".contains("") ❌ 纯 Swift true true ✅ + Foundation
Swift 6.2 新武器:`weak let` —— 既弱引用又不可变的安全魔法
为什么需要 weak let? 需求场景 weak var的痛点 weak let的新能力 并发安全的 Sendable类型 weak var无法标记 Sendable ✅ 可以 不可重新赋值的弱引用
吃透 Swift 的 `@autoclosure`:把“表达式”变“闭包”的延迟利器
什么是 @autoclosure? 一句话:把“传入的表达式”自动包成“无参闭包”,实现延迟求值(lazy evaluation)。 语法糖级别:调用方完全无感,只需像传普通值一样写表达式;函数内部拿
@Observable 遇上属性包装器:一键绕过‘计算属性’禁令的 Swift 5.9 实战技巧
在 Swift 5.9 引入的 @Observable 宏(Observable framework)让“全部属性默认被观察”成为可能,但也带来了一个副作用: 下面给出原因剖析 + 最小修复示例 +
如何绕过“Extensions must not contain stored properties”错误
为什么 Swift 禁止扩展里存值? Swift 扩展(extension)不能增加存储属性,原因有三: 内存布局已确定 类/结构体的大小在编译期就固定,随意加字段会破坏 ABI。 类型安全 允许多个
彻底搞懂 Swift 的 Any、AnyObject、any
一张速查表先拎清 名称 具体类型 能容纳 典型场景 Swift 版本 Any 顶层类型(具体类型) 任意值(含函数、元组、struct、class) 与旧 API 交互、极少数极端动态场景 1.0+
OptionSet vs Enum:Swift 中如何优雅地表达“多选”?
两种“多选”方案的基因差异 维度 OptionSet Enum + Set 底层模型 位图(bitset) 哈希集合(HashSet) 存储大小 固定位宽(UInt8/Int/UInt64) 动态哈希
Swift 的 Optional.take():一次性消费值的神器
什么是 take()? take() 是 Swift6 标准库提供的 Optional 实例方法: “如果有值就返回它,同时把自己置为 nil;如果已经是 nil 就返回 nil。” 等价于“原子地消
打造零泄漏的 Swift 代码:三套实用工具完整指南
为什么需要这三件套? 痛点 工具 一句话作用 保留循环导致 Coordinator/VM 不释放 MemoryLeakMonitor 运行时断言实例数量 Delegate 数组、观察者列表强引用 @W
深入理解 Swift 的 `withExtendedLifetime`:原理、场景与实战
为什么要延长对象生命周期? Swift 的 ARC(自动引用计数) 会在最后一次强引用解除时立即释放对象。在绝大多数情况下,这是正确的行为。 但在以下场景,“立即释放”反而会导致崩溃或逻辑错误: C/
深入理解 Swift `@resultBuilder`:从 SwiftUI 到通用 DSL 的完全指南
一句话总结 @resultBuilder 是一套编译期 DSL 引擎:通过在 Builder 类型里实现若干静态方法,把“多行表达式”在编译期重写成“单个结果值”。 SwiftUI 的 @ViewBu
下一页