类型 xxx 的值没有成员 xxx SwiftuI 中的错误?

时间:2021-06-17 16:45:14

标签: arrays swift dictionary swiftui

我已经为此苦苦挣扎了多年,但我不明白为什么我根本无法通过它。

我有一个看起来像这样的数组:

{
    "status": "OK",
    "tickets": {
        "open_tickets": [
            {
                "uuid": "XXXXXXX",
                "package": {
                    "title": "XXXX",
                    "buyer": {
                        "name": "XXX",
                        "family_name": null,
                        "email": "XXXXX",
                        "buyer_profile": {
                            "telephone": "5435345"
                        }
                    }
                }
            }
        ],
        "closed_tickets": []
    }
}

我正在尝试访问嵌套数组。具体来说,open_tickets

所以,我试过了:

我已将其置于结构和主体之间的视图顶部:

@ObservedObject var fetcherL = FetcherL()

现在我尝试从远程 URL 读取数据:

public class FetcherL: ObservableObject {

    @Published var ticket = [Open_Tickets]()
    
    init(){
        load()
    }
    
    func load() {

let url = URL(string: "HTTPS://xxxxxxx")
var request = URLRequest(url: url!)


        URLSession.shared.dataTask(with: request) {(data,response,error) in
            do {
                if let d = data {
                    
                    let res = try JSONDecoder().decode(RootO.self, from: d)
                    DispatchQueue.main.async {
                        //self.ticket = res.tickets.open_tickets
                        self.ticket = res.tickets.open_tickets
                        
                    }
                    
              
                }else {
                    print("No Data")
                }
            } catch {
                print (error)
            }
            
        }.resume()

    }

}


struct RootO: Codable {

    let tickets: [Tickets]
    
    enum CodingKeys: String, CodingKey {

        case tickets = "tickets"
    }
}


struct Tickets: Codable {
    
    let open_tickets: [Open_Tickets]

    enum CodingKeys: String, CodingKey {
           case open_tickets = "open_tickets"

        }
}


struct Open_Tickets: Codable{
    
    let ticket_number: String

    enum CodingKeys: String, CodingKey {
           case ticket_number = "ticket_number"

        }
    
}

但是这段代码给出了这个错误并阻止我编译我的应用程序:

Value of type '[Tickets]' has no member 'open_tickets'

enter image description here

有人可以就此提出建议吗?

2 个答案:

答案 0 :(得分:1)

您收到错误的原因在于您的 Root0

struct RootO: Codable {

    let tickets: [Tickets]
    
    enum CodingKeys: String, CodingKey {

        case tickets = "tickets"
    }
}

您希望您的 Root0 有一个名为 tickets 的字段,需要一个 Tickets 数组,但是响应的 tickets 属性是一个[String: [Tickets]

字典

这是一个可行的解决方案:

let json = """
{
    "status": "OK",
    "tickets": {
        "open_tickets": [
            {
                "uuid": "XXXXXXX",
                "package": {
                    "title": "XXXX",
                    "buyer": {
                        "name": "XXX",
                        "family_name": null,
                        "email": "XXXXX",
                        "buyer_profile": {
                            "telephone": "5435345"
                        }
                    }
                }
            }
        ],
        "closed_tickets": []
    }
}
""".data(using: .utf8)!


struct RootO: Codable {
    let tickets: [String: [Ticket]]

    var openTickets: [Ticket] {
        if let data = tickets["open_tickets"] {
            return data
        } else {
            return []
        }
    }

    var closedTickets: [Ticket] {
        if let data = tickets["closed_tickets"] {
            return data
        } else {
            return []
        }
    }
}


struct Ticket: Codable {
    let ticketNumber: String

    enum CodingKeys: String, CodingKey {
        case ticketNumber = "uuid"
    }
}

let decoder = JSONDecoder()
let decoded = try! decoder.decode(RootO.self, from: json)

print("Open tickets = \(decoded.openTickets.count)")
print("Closed tickets = \(decoded.closedTickets.count)")

一些建议:

  • 单数名词用于结构Ticket,而不是Ticket。
  • 如果属性名称相同,则不需要提供编码键

答案 1 :(得分:0)

改变RootO结构试试看,“tickets”是对象而不是数组

struct RootO: Codable {
    
        let tickets: Tickets
        
        enum CodingKeys: String, CodingKey {
    
            case tickets = "tickets"
        }
    }