【问题标题】:Value of type xxx has no member xxx Error in SwiftuI?xxx 类型的值没有成员 xxx SwiftuI 中的错误?
【发布时间】:2021-09-02 11:59:17
【问题描述】:

多年来我一直在为此苦苦挣扎,但我完全不明白为什么我无法通过这个。

我有一个如下所示的数组:

{
    "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'

有人可以请教一下吗?

【问题讨论】:

  • 将模型中的 let tickets: [Tickets] 更改为 let tickets: Tickets。在 json 中,tickets 不是数组而是对象。
  • @RajaKishan,产生keyNotFound(CodingKeys(stringValue: "tickets", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"tickets\", intValue: nil) (\"tickets\").", underlyingError: nil))
  • 使用某个站点从 json 创建模型:app.quicktype.io

标签: arrays swift dictionary swiftui


【解决方案1】:

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

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

【讨论】:

  • 是的门票是一个对象而不是一个数组,但它不是门票类型的对象 - 因此您没有提供正确的答案。
【解决方案2】:

您收到错误的原因在于您的 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而不是Tickets。
  • 如果属性名称相同,则无需提供编码键

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2020-02-13
    • 2023-03-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多