Robert
Robert

Reputation: 1200

SwiftUI value of type [x] has no member [y], but the struct has the member

I'm getting an error that Value type of screen has no member elements, but looking at my struct I can see it there. Is there a limit in how far my foreach can drill down to?

Here's where I'm getting the error

ForEach(remedydata?.remedy.content.screens.elements ?? []) { remedy in

If I remove elements I don't have any issues

My state is set as

@State var remedydata: Welcome? = nil

My struct looks like the below

// MARK: - Welcome
struct Welcome: Codable {
    let remedy: Remedy
}

// MARK: - Remedy
struct Remedy: Codable {
    let id, tenantID: String
    let version: Int
    let title, remedyClientID, createdAt, remedyDescription: String
    let enabled: Bool
    let trigger: Trigger
    let requiredHostCapabilities: [RequiredHostCapability]
    let localizedStrings: [LocalizedString]
    let content: Content
    let actor: String

    enum CodingKeys: String, CodingKey {
        case id
        case tenantID = "tenantId"
        case version, title
        case remedyClientID = "remedyClientId"
        case createdAt
        case remedyDescription = "description"
        case enabled, trigger, requiredHostCapabilities, localizedStrings, content, actor
    }
}

// MARK: - Content
struct Content: Codable {
    let serializationVersion: Int
    let screens: [Screen]
}

// MARK: - Screen
struct Screen: Codable, Identifiable {
    let id: Int
    let title: String
    let elements: [Element]
}

// MARK: - Element
struct Element: Codable, Identifiable {
    let id = UUID()
    let tag: Tag
    let text: String
    let action: Action?

Upvotes: 2

Views: 1113

Answers (1)

George
George

Reputation: 30481

You can't do remedydata?.remedy.content.screens.elements since remedydata?.remedy.content.screens is an Array. In the question, you have multiple Element inside multiple Screen, which means you have two options:

  • Display each Element for a specific Screen.
  • Display a specific Element for each Screen.

To "Display each Element for a specific Screen":

ForEach(remedydata?.remedy.content.screens.first?.elements ?? []) { element in
    Text(element.text)
}

To "Display a specific Element for each Screen":

ForEach(remedydata?.remedy.content.screens ?? []) { screen in
    Text(screen.elements.first?.text ?? "")
}

Upvotes: 2

Related Questions