我是 SwiftUI 的新手,正在嘗試構建一個簡單的單人測驗應用程式。我從遵循本教程開始,然后嘗試自己繼續。目前,這些問題已硬編碼在我的 ViewModel 中,但我想將其更改為從本地 JSON 檔案中獲取。任何人都可以指出我正確的方向?
這是我的 ViewModel 的一部分,問題是靜態資料:
extension GameManagerVM {
static var questions = quizData.shuffled()
static var quizData: [QuizModel] {
[
QuizModel(
id: 1,
question: "Question title 1",
category: "Sport",
answer: "A",
options: [
QuizOption(id: 11, optionId: "A", option: "A"),
QuizOption(id: 12, optionId: "B", option: "B"),
QuizOption(id: 13, optionId: "C", option: "C"),
QuizOption(id: 14, optionId: "D", option: "D")
]
),
...
}
}
這是我做的一個測驗,但我收到了 Xcode 無法解碼的錯誤。我用這個替換上面的代碼:
extension GameManagerVM {
static var questions = quizData.shuffled()
static var quizData: [QuizModel] = Bundle.main.decode("quizquestions2022.json")
}
這是 JSON。
[
{
"id": "1",
"question": "Question title 1",
"category": "Sport",
"answer": "A",
"options": [
{
"id": "1001",
"optionId": "A",
"option": "A"
},
{
"id": "1002",
"optionId": "B",
"option": "B"
},
{
"id": "1003",
"optionId": "C",
"option": "C"
},
{
"id": "1004",
"optionId": "D",
"option": "D"
}
]
},
]
這是我的模型
struct Quiz {
var currentQuestionIndex: Int
var quizModel: QuizModel
var quizCompleted: Bool = false
var quizWinningStatus: Bool = false
var score: Int = 0
}
struct QuizModel: Identifiable, Codable {
var id: Int
var question: String
var category: String
var answer: String
var options: [QuizOption]
}
struct QuizOption: Identifiable, Codable {
var id: Int
var optionId: String
var option: String
var isSelected: Bool = false
var isMatched: Bool = false
}
uj5u.com熱心網友回復:
當您解碼時,除非您像這個示例 init fromdecoder那樣進行自己的解碼,那么結構中所有非可選的 vars 或 let 都需要在 json 中。您的資料在選項中沒有 isSelected 或 isMatched,因此這些需要是可選的
struct QuizOption: Identifiable, Codable {
var id: Int
var optionId: String
var option: String
var isSelected: Bool?
var isMatched: Bool?
uj5u.com熱心網友回復:
要從本地 JSON 檔案中獲取資料,您可以嘗試這種方法,您需要有一個模型 ( QuizModel) 來匹配檔案中的 json 資料。我還使用 aclass GameManagerVM: ObservableObject
來保存/發布您的資料作為示例:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject var gameManager = GameManagerVM()
var body: some View {
List {
ForEach(gameManager.quizData) { quiz in
Text(quiz.question)
}
}
}
}
struct QuizModel: Identifiable, Codable {
let id, question, category, answer: String
let options: [QuizOption]
enum CodingKeys: String, CodingKey {
case id, question, category, answer, options
}
}
struct QuizOption: Codable {
let id, optionId, option: String
var isSelected: Bool = false
var isMatched: Bool = false
enum CodingKeys: String, CodingKey {
case id, optionId, option
}
}
class GameManagerVM: ObservableObject {
@Published var questions: [QuizModel] = []
@Published var quizData: [QuizModel] = []
init() {
quizData = Bundle.main.decode("quizquestions2022.json")
questions = quizData.shuffled()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404613.html
標籤:
