Home > Back-end >  How to define a struct for a Swift UI View?
How to define a struct for a Swift UI View?

Time:09-19

I am a beginner at SwiftUI.

I created a struct to save some text and the detail information link page. like this:

struct First: Identifiable {
    let title: String 
    let icon: String
    let id = UUID()
    let link: View //link to customised page

the property link will save the View I have created as Page1.swift, Page2.swift, Page2.swift...

How to define the link type in the struct First?

Thanks a lot.

CodePudding user response:

I use something similar in my code. I use AnyView (not recommended by Apple)

struct First: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: AnyView
}

and when I call the view, I do

AnyView(MyView()) 

OR (thanks Timmy)

struct First<Content: View>: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: Content
}

and call the view with

First(title: "xxx", icon: "xxx", link: View1())

The second method does not work if it is included in a static property.

Error : Static stored properties not supported in generic types

CodePudding user response:

  1. You can use AnyView(not recommended):
struct First: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: AnyView
  1. Using generics:
struct First<Content: View>: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: Content
  1. You could instead create an enum:
enum First: Int, Identifiable {
    //your cases
    var id: Int {
        return rawValue
    }
    var title: String {
        switch self {
            //cases
        }
    }
    var icon: String {
        switch self {
            //cases
        }
    }
    var link: some View {
        switch self {
            //cases
        }
    }
}

CodePudding user response:

Thanks @Timmy, Thanks @dibs,

I use this define and the program run with code First(title: "xxx", icon: "xxx", link: AnyView(View1())), First(title: "xxx", icon: "xxx", link: AnyView(View2())), as below:

struct First: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: AnyView
}

but the second way, there is some wrong when I call views by below way: First(title: "xxx", icon: "xxx", link: View1()), First(title: "xxx", icon: "xxx", link: View2()),

I try to use the way to call view by link: AnyView(View1()), link: AnyView(View2()), it success.

struct First<Content: View>: Identifiable {
    let title: String
    let icon: String
    let id = UUID()
    let link: Content

Thanks the help from @Timmy, @dibs

  • Related