SwiftUI 4:如何解决AnyLayout 'init(_:)'初始化错误?
在Xcode 14 Beta 3(SwiftUI 4)中使用AnyLayout切换布局的编译错误解决办法
你遇到的问题是Xcode 14 Beta 3的兼容性问题——早期SwiftUI 4 beta版本里,HStack、VStack这类容器视图并没有直接遵循新引入的Layout协议,而AnyLayout的初始化要求传入遵循Layout的类型,所以编译器抛出了错误。
有两种可行的解决方式:
方法一:使用专用的Layout类型替换
SwiftUI 4新增了HStackLayout和VStackLayout,这两个类型是专门遵循Layout协议的布局实现,直接替换原来的HStack()和VStack()即可:
struct DynamicLayoutExample: View { @Environment(\.dynamicTypeSize) var dynamicTypeSize var body: some View { let layout = dynamicTypeSize <= .medium ? AnyLayout(HStackLayout()) : AnyLayout(VStackLayout()) layout { Text("First label") Text("Second label") } } }
方法二:直接用条件视图切换
如果不想用AnyLayout,也可以直接通过条件判断切换不同的容器视图,这种方式在早期beta里更稳定:
struct DynamicLayoutExample: View { @Environment(\.dynamicTypeSize) var dynamicTypeSize var body: some View { if dynamicTypeSize <= .medium { HStack { Text("First label") Text("Second label") } } else { VStack { Text("First label") Text("Second label") } } } }
后续的Xcode 14 beta版本(比如beta4及以后)修复了这个问题,原来的HStack/VStack可以直接传入AnyLayout,但在beta3里必须用上述方法解决。
内容的提问来源于stack exchange,提问作者PerroVerde
相关产品推荐
相关产品推荐

