SwiftUI技术问题:向TagsView传字符串数组遇初始化器权限错误
错误原因
你的TagsView结构体中包含了一个私有存储属性private var layout = [GridItem(.fixed(30))],Swift会自动合成包含所有存储属性的成员初始化器,而只要结构体中有私有存储属性,自动生成的初始化器访问级别就会变成private,导致外部视图(比如MainView)无法调用TagsView(tags:)进行初始化。
解决方案
有两种可行的修复方式,根据你的需求选择:
方案1:移除layout的私有访问修饰符
如果layout不需要严格私有,直接去掉private关键字,让自动合成的初始化器可以被外部访问:
struct TagsView: View { var tags: [String] var layout = [GridItem(.fixed(30))] // 移除private var body: some View { HStack { Spacer() GeometryReader { geo in ScrollView(.horizontal, showsIndicators: false) { LazyHGrid(rows: layout) { ForEach(tags, id: \.self) { tag in Button(tag) { // 按钮点击逻辑 } .font(.callout.bold()) } } } } } } }
方案2:手动编写公开的初始化器
如果需要保持layout的私有性,手动为TagsView编写一个仅接收tags参数的公开初始化器:
struct TagsView: View { var tags: [String] private var layout = [GridItem(.fixed(30))] // 手动定义公开初始化器,仅暴露tags参数 init(tags: [String]) { self.tags = tags } var body: some View { HStack { Spacer() GeometryReader { geo in ScrollView(.horizontal, showsIndicators: false) { LazyHGrid(rows: layout) { ForEach(tags, id: \.self) { tag in Button(tag) { // 按钮点击逻辑 } .font(.callout.bold()) } } } } } } }
额外注意
你原来的代码中body部分存在未闭合的大括号,修复时需要补全所有结构的闭合括号,否则会引发额外的编译错误。
内容的提问来源于stack exchange,提问作者Mc.Lover
相关产品推荐
相关产品推荐

