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

推荐订阅源

Cloudbric
Cloudbric
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
美团技术团队
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
博客园 - Franky
罗磊的独立博客
雷峰网
雷峰网
F
Fortinet All Blogs
Stack Overflow Blog
Stack Overflow Blog
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
H
Help Net Security
Vercel News
Vercel News
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
量子位
F
Full Disclosure
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
WordPress大学
WordPress大学
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
D
Docker
T
Tailwind CSS Blog
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
Y
Y Combinator Blog
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
Recent Announcements
Recent Announcements
V
Visual Studio Blog
The Cloudflare Blog
P
Proofpoint News Feed

看川博客

我被 AI "蒸馏" 了 - 看川博客 距离上线只差一个软件著作权证书 - 看川博客 开发简报(2):开发者需要先进的工具 - 看川博客 比越狱更棘手!iOS vPhone 虚拟机成黑灰产新温床 - 看川博客 开发简报(1):拥抱 AI、别无选择 - 看川博客 糟糕!我的 OpenClaw 中了病毒 - 看川博客 今天你用了多少词元? - 看川博客 闪忆 LiveMem:把回忆做成会动的壁纸 - 看川博客 Swift 从 ObservableObject 迁移到 @Observable 的再讨论 视频帧截图(Video2Frame)专业视频抽帧截图工具 - 看川博客 录音记事本 - 专业安全的录音工具 App - 看川博客 Swift 从 ObservableObject 迁移到 @Observable 从 Apple Distribution Managed 证书提取备案所需公钥和 SHA1 条码助手 iOS 2.0.0 升级指南 - 看川博客 SwiftUI Menu checkmark 文本对齐 - 看川博客 C++ RTTI 信息对二进制体积和安全性的影响 - 看川博客 SwiftUI 系统颜色表查询 - 看川博客 读马伯庸《长安的荔枝》 - 看川博客 PHP json_encode UTF-8 中文编码问题 - 看川博客 我为什么重新运营微信公众号 - 看川博客 使用 TrollStore(巨魔) 在非越狱设备上安装任意 IPA - 看川博客 条码助手小程序更新 - 看川博客 iOS 18 中 libdyld.dylib/dyld 的一些变化 涨粉神器?解密“抖音黑科技”云端商城 - 看川博客
SwiftUI List selection 的使用提示 - 看川博客
2025-01-20 · via 看川博客

List 是常用的 SwiftUI 组件,在 iOS 中,其构造接口中的 selection 参数必须绑定到 Optional 型,否则 Swift Compiler 会报错。

尽管 SwiftUI 日渐成熟,但实际开发中可能还是会遇到一些莫名其妙的问题。糟糕的是,到 Xcode 16.2 为止,Swift Compiler 的报错提示有时候还是差点意思。比如有时候会报如下错误:

the compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

第一次遇到这个问题很让人摸不着头脑。实际上,上述错误基本都是因为表达式中有类型相关的错误,但这个报错提示没有给出有价值的信息来帮助开发者定位具体的错误位置。

比如以下代码:

List(selection: $selection) 

当 selection 为非 Set 时(为 Set 时,List 在编辑模式下支持多选),必须定义为可选型,否则就会报上述错误。而且邪门的是,仅会在 iOS 上报错,macOS 上完全没问题。相关讨论:SwiftUI 4 List initializer not available in iOS.

同样的,在 onChange 方法中,根据监听值 selection 的类型,newValue 也要处理可选还是非可选,否则有时候编译器一样会稀里糊涂地报上述错误。

.onChange(of: selection, { oldValue, newValue in
	if let _ selection = selection {}
})

在回到 List(selection: $selection) ,还需要注意,这里的 selection 参数必须符合 Hashable 协议,这就导致如果尝试将 selection 绑定到一个协议上会报错。比如:

@Binding var selection: any MySelection

相关讨论可以参考这里:SwiftUI Binding problems with protocols.

这个特性在一些情况下会很好用,还是期待后续的 Swift 能支持这个特性。