skip to Main Content

I have a view called TagView which creates a list of tags using LazyHGrid I am trying to get the array of tags that loads from the web service and pass it from the main view to TagView. Here is the code:

struct TagsView: View {

var tags: Array<String>
private var layout = [GridItem(.fixed(30))]

var body: some View {
    HStack {
        Spacer()
        GeometryReader { geo in
            ScrollView(.horizontal, showsIndicators: false) {
            
                    LazyHGrid(rows: layout) {
                        ForEach(tags, id: .self) {
                            Button("($0)") {
                                
                            }
                            .font(.callout.bold())

                        }
                    }
                }
           }
    

After creating the variable: var tags: Array<String> I need to get the array from the main view like this:

struct MainView: View {
    var model: Model
    var body: some View {
        VStack {
            TagsView(tags: model.tags)
        }
    }
}

But I am getting this error:

TagsView’ initializer is inaccessible due to ‘private’ protection
level

I tried with @Binding and still no luck, any help would be great!

3

Answers


  1. Chosen as BEST ANSWER

    Using Generate memberwise initializer fixed the problem:

    internal init(tags: Array<String>) {
            self.tags = tags
        }
    

    enter image description here


  2. The reason for this error is that the synthesized init is being marked private since one of the properties is private. To solve the problem, remove the private or add:

    init(tags: Array<String>) {
        self.tags = tags
    }
    
    Login or Signup to reply.
  3. Just change layout to a let constant:

        private let layout = [GridItem(.fixed(30))]
    

    Then the auto-generated init will not be private.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search