Swift 6.2 新武器:`weak let` —— 既弱引用又不可变的安全魔法

为什么需要 weak let

需求场景 weak var的痛点 weak let的新能力
并发安全的 Sendable类型 weak var无法标记 Sendable ✅ 可以
不可重新赋值的弱引用 仍可能被外部篡改 ✅ 编译期禁止
值类型持有弱引用 无法保证不变性 ✅ 完美支持

一句话:弱引用 + 不可变 = 更安全的所有权图。

语法速览

swift 复制代码
final class Downloader: Sendable {
    // 1️⃣ 一次性设置,之后不可改指向
    weak let delegate: DownloaderDelegate?
    
    init(delegate: DownloaderDelegate?) {
        self.delegate = delegate
    }
}
  • 仍遵守 ARC:目标释放后自动变 nil

  • 编译器禁止重新赋值:

    downloader.delegate = AnotherVC() // ❌ 直接报错。

完整示例:下载器 + 控制器

swift 复制代码
protocol DownloaderDelegate: AnyObject {
    func downloadDidUpdate(progress: Double)
}

final class Downloader: Sendable {
    weak let delegate: DownloaderDelegate?
    
    init(delegate: DownloaderDelegate?) {
        self.delegate = delegate
    }
    
    func simulateDownload() {
        delegate?.downloadDidUpdate(progress: 0.5)
    }
}

final class ViewController: DownloaderDelegate {
    func downloadDidUpdate(progress: Double) {
        print("进度:\(progress)")
    }
}

// MARK: - 测试
var vc: ViewController? = ViewController()
let downloader = Downloader(delegate: vc)
downloader.simulateDownload()   // ✅ 打印 0.5

vc = nil
downloader.simulateDownload()   // ✅ delegate 自动 nil,无崩溃

迁移清单:何时把 weak var 换成 weak let

场景 建议
代理/回调 一次性设置 直接替换
单元测试需要多次赋值 保持 weak var
值类型(struct)持有弱引用 立即使用 weak let
actor / TaskGroup 内部 优先 weak let以获得 Sendable资格

实战:值类型快照

swift 复制代码
struct UserSnapshot {
    let name: String
    weak let avatarLoader: AvatarLoader?   // 不持有加载器
}
  • 即使 avatarLoader 释放,UserSnapshot 依旧安全。
  • 结构体可以跨线程传递,无需担心循环引用。

一句话总结

weak let = "一次性弱引用",让 不可变性 与 ARC 安全 在同一行代码握手。

在并发、UI、快照场景里,它是 Swift 6.2 给你的"隐形护栏"。

相关推荐
fendoudexiaoniao_ios2 天前
iOS 列表拖拽cell排序
ios·swift
大熊猫侯佩3 天前
Swift 6 驱魔实录:揭开 Combine 与 @Sendable 的“血色契约”
swift·block·combine·preconcurrency·sendable·mainactor·isolation
初级代码游戏3 天前
iOS开发 SwiftUI 15:手势 拖动 缩放 旋转
ios·swiftui·swift
ujainu3 天前
Flutter + OpenHarmony 游戏开发进阶:虚拟摄像机系统——平滑跟随与坐标偏移
开发语言·flutter·游戏·swift·openharmony
初级代码游戏6 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏6 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui6 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhangfeng11336 天前
CSDN星图 支持大模型微调 trl axolotl Unsloth 趋动云 LLaMA-Factory Unsloth ms-swift 模型训练
服务器·人工智能·swift
zhyongrui7 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
大熊猫侯佩8 天前
Neo-Cupertino 档案:撕开 Actor 的伪装,回归 Non-Sendable 的暴力美学
swift·observable·actor·concurrency·sendable·nonsendable·data race