关于#Preview(_:traits:_:body:)仅支持iOS 17.0及以上版本的疑问
#Preview(_:traits:_:body:)仅支持iOS 17.0及以上版本的疑问 嘿,我来帮你拆解这些关于Xcode预览的疑问,都是开发中很常见的困惑~
关于#Preview和PreviewProvider的关系
首先明确:#Preview确实是PreviewProvider的语法糖,底层逻辑还是基于PreviewProvider实现的,但它为什么不支持旧系统呢?
1.1 为什么#Preview不支持iOS 17以下版本?
#Preview是Xcode 15(对应iOS 17)才推出的新特性,苹果在设计它的时候,绑定了iOS 17里新增的预览能力——比如你用到的.sizeThatFitsLayout这个traits,就是iOS 17 SDK里才有的新API。虽然它底层依赖PreviewProvider,但这个宏语法本身需要新系统的框架支持,旧系统的SDK里没有这些新的预览相关接口,自然没法向下兼容。简单说,这是苹果为新系统量身打造的简化写法,旧系统没这个基础,用不了很正常。
1.2 原PreviewProvider有问题吗?
完全没有!PreviewProvider从iOS 13开始就存在,是非常稳定的旧API,至今依然是兼容低版本系统的最佳选择。苹果推出#Preview只是为了让新系统下的预览代码写起来更简洁、更直观,绝非因为旧的PreviewProvider有缺陷。
为什么预览会受iOS版本限制?
很多人误以为Xcode的预览是在本地直接运行的,但其实不是:
Xcode的预览功能(不管是PreviewProvider还是#Preview)本质上是把你的预览代码编译后,送到iOS模拟器(或者连接的真机)里运行的。也就是说,预览的执行环境是真实的iOS系统(模拟器模拟的也是对应版本的系统),你的代码必须符合目标系统版本的SDK要求。
比如你用了#Preview(traits: .sizeThatFitsLayout),这个.sizeThatFitsLayout是iOS 17才有的属性,而你的目标系统是iOS 13——编译器在检查的时候发现iOS 13的SDK里根本没有这个东西,自然就会报错说“仅在iOS 17.0或更高版本可用”。不是Xcode依赖iOS,而是预览代码的执行环境必须匹配你指定的iOS版本的能力。
备注:内容来源于stack exchange,提问作者Trajanos

