我正在制作测验应用程序。我正在尝试访问JSON文件,并查看用户输入的内容是否与JSON中的内容相同,如果是,则应用程序应更新图像视图以显示新问题。全部在一个控制器中完成。
我的文件称为Answers.json:
[
{
"Question Number": {
"13": {
"Answer": [
"7/16"
]
},
"14": {
"Answer": [
"25π",
"(25)(π)",
"π25",
"25(π)",
"(25)π",
"25(π)"
]
},
"15": {
"Answer": [
"6"
]
}
}
}
]
这是我目前拥有的:
let enteredLevel = 14
guard let path = Bundle.main.path(forResource: "answers", ofType: "json") else { return }
let url = URL(fileURLWithPath: path)
do {
let data = try Data(contentsOf: url)
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
//print(json)
guard let array = json as? [Any] else { return }
let i = enteredLevel
for user in array {
guard let userDict = user as? [String: Any] else { return }
guard let questions = userDict["Question Number"] as? [String: Any] else { return }
guard let questionNum = questions["\(i)"] as? [String:Any] else {return}
guard let qAnswer = questionNum["Answer"] else { return }
print(qAnswer)
我的问题是,首先,我已在viewDidLoad中编写了以上代码,但稍后无法在代码中调用qAnswer
变量。另外,如果我从qAnswer
行中删除防护,则可以调用qAnswer
,但是在尝试将用户输入与qAnswer
变量中的内容进行比较时会出错,因为qAnswer
的文件类型为Any
],并且用户输入的文件类型为String
。
请帮助。谢谢
1--因为您要在qAnswer
的范围内声明变量viewDidLoad
,所以在其余的代码中将无法使用它。例如,您可以为您的类声明一个实例变量,该实例变量包含一个答案列表,并且在整个类中都可以使用。
2-我不确定第二个问题,因为删除guard
不会使您所说的成为现实。这是为什么:
guard let questionNum = questions["\(i)"] as? [String:Any]
语句基本上说questionNum
应该是具有String
类型的键和Any
类型的值的字典。
然后,您用键Answer
查找值。由于您不知道该值是否存在,因此Swift将返回一个可选(即可为空)值,因此返回的值是Any?
类型,您可以使用防护将其更改为Any
。
我的建议是使此代码正常运行,如下所示更改代码:
guard let questionNum = questions["\(i)"] as? [String : Any] else { return }
// Change to:
guard let questionNum = questions["\(i)"] as? [String : String] else {return}