如何在SwiftUI多Preview间共享数据且不遗留至Release构建
解决Xcode 15+中预览共享代码的Release构建移除问题
针对你想要实现的预览共享代码与预览内容一同从Release构建中移除的需求,以下是符合Apple设计意图的可行方案:
方案1:用DEBUG专属结构体封装共享预览数据
将预览需要的共享数据放在#if DEBUG包裹的结构体中,通过@usableFromInline让预览宏可以访问:
#if DEBUG @usableFromInline struct PreviewSharedData { static let prevBill = Backend.Bill(initString: "Blah") } #endif #Preview("light") { BillView(bill: PreviewSharedData.prevBill) } #Preview("dark") { BillView(bill: PreviewSharedData.prevBill) .preferredColorScheme(.dark) }
PreviewSharedData仅在DEBUG构建中存在,不会进入Release包#Preview宏在Release构建时会被Xcode自动完全剥离,不会留下对PreviewSharedData的引用,因此不会触发编译错误
方案2:直接用DEBUG全局变量
如果共享数据不需要结构化管理,也可以直接定义DEBUG专属的全局变量:
#if DEBUG let prevBill = Backend.Bill(initString: "Blah") #endif #Preview("light") { BillView(bill: prevBill) } #Preview("dark") { BillView(bill: prevBill) .preferredColorScheme(.dark) }
Xcode 15+已经修复了早期版本中预览宏残留引用的问题,Release构建时#Preview的所有内容会被彻底移除,不会引用到DEBUG专属变量,因此Archive时不会编译失败。
关于#if DEBUG包裹#Preview的疑问
Apple不推荐手动用#if DEBUG包裹#Preview,因为该宏本身就被设计为在Release构建中自动移除,手动包裹反而可能导致预览画布的实时预览功能出现状态不一致的问题。上面的方案既遵循了Apple的设计逻辑,又能确保预览相关代码完全脱离Release构建。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

