我需要創建一個能夠回傳 GitHub 用戶擁有的所有存盤庫的應用程式。
我創建了一個包含 3 個檔案的應用程式:內容視圖
import SwiftUI
struct ContentView: View {
@StateObject var netManager = NetworkingManager()
var body: some View {
List {
ForEach(netManager.owner) { item in
Text(item.reposUrl)
}
}
}
}
API 密鑰
import Foundation
struct Root : Decodable, Identifiable {
let id: Int
let items : [Repository]
}
struct Repository: Decodable, Identifiable {
let id: Int
let name, fullName: String
let owner : Owner
}
struct Owner : Decodable, Identifiable {
let id: Int
let reposUrl : String
}
解碼器(因為我知道我以后應該需要另一個,除非我可以足夠抽象這個)
class NetworkingManager: ObservableObject{
@Published var owner = [Owner]()
init() {
loadData()
}
func loadData() {
guard let url = URL(string: "https://api.github.com/users/jacobtoye/repos") else { return }
URLSession.shared.dataTask(with: url) {(data, _, _) in
guard let data = data else { return }
do {
let response = try JSONDecoder().decode(Owner.self, from: data)
} catch {
print("error: \(error)")
}
}.resume()
}
}
代碼運行良好,但我沒有得到任何結果(第一個螢屏是空白的),我想在那里查看所選用戶存盤庫的串列。你能幫我解碼字典嗎?
我還想知道問題是否不在于我也沒有使用 convertFromSnakeCase 鍵解碼策略,但是當 JSONDecoder 包裝在常量中時,我不知道如何將其放在那里。
uj5u.com熱心網友回復:
對于極簡的作業示例代碼,試試這個:
struct Repository: Decodable, Identifiable {
let id: Int
let name, fullName: String
let owner: Owner
enum CodingKeys: String, CodingKey {
case id, name, owner
case fullName = "full_name" // <-- here
}
}
struct Owner : Decodable, Identifiable {
let id: Int
let reposUrl : String
enum CodingKeys: String, CodingKey, CaseIterable {
case id
case reposUrl = "repos_url" // <-- here
}
}
class NetworkingManager: ObservableObject{
@Published var owner = [Owner]()
init() {
loadData()
}
func loadData() {
guard let url = URL(string: "https://api.github.com/users/jacobtoye/repos") else { return }
URLSession.shared.dataTask(with: url) {(data, _, _) in
guard let data = data else { return }
DispatchQueue.main.async { // <-- here
do {
let repos = try JSONDecoder().decode([Repository].self, from: data) // <-- here
repos.forEach{ self.owner.append($0.owner) }
} catch {
print("error: \(error)")
}
}
}.resume()
}
}
struct ContentView: View {
@StateObject var netManager = NetworkingManager()
var body: some View {
List {
ForEach(netManager.owner) { item in
Text(item.reposUrl)
}
}
}
}
這應該給你一個串列,"https://api.github.com/users/jacobtoye/repos"因為那是資料的組成部分。
EDIT-1:列出所有回購
class NetworkingManager: ObservableObject{
@Published var repos = [Repository]() // <-- here repos
init() {
loadData()
}
func loadData() {
guard let url = URL(string: "https://api.github.com/users/jacobtoye/repos") else { return }
URLSession.shared.dataTask(with: url) {(data, _, _) in
guard let data = data else { return }
DispatchQueue.main.async { // <-- here
do {
self.repos = try JSONDecoder().decode([Repository].self, from: data) // <-- here
} catch {
print("error: \(error)")
}
}
}.resume()
}
}
struct ContentView: View {
@StateObject var netManager = NetworkingManager()
var body: some View {
List {
ForEach(netManager.repos) { repo in
VStack {
Text(repo.fullName).foregroundColor(.blue)
Text(repo.owner.reposUrl)
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462556.html
