我确实在确定SwiftyJson中返回的特定值时遇到了麻烦;希望有人可以帮我解释一下。
我想知道预定的单词“apple”与从JSON响应中收到的任何单词之间是否匹配。
如果匹配,则显示一条消息,用户选择进入下一级别或用户返回主屏幕。
如果没有匹配则显示一条消息,用户必须继续播放或取消播放。
我想在不同级别的游戏中为多个单词执行此操作。
第一级:将“apple”与任何收到的JSON响应匹配。
第二级:将“计算机”与任何收到的JSON响应匹配。
第三级:将“电话”或“电话”或“iPhone”或“Android”或任何或所有上述内容与任何收到的JSON回复进行匹配。
所以,基本上,我可以获得所有JSON响应,但是我很难找到如何设置以确定是否返回了特定的预定义JSON响应。
我已经到处寻找了几个星期与另一个帖子,但无济于事:(
JSON响应
{
"responses" : [
{
"labelAnnotations" : [
{
"mid" : "\/m\/01m2v",
"score" : 0.9245476,
"description" : "computer keyboard"
},
{
"mid" : "\/m\/01c648",
"score" : 0.7945268,
"description" : "laptop"
},
{
"mid" : "\/m\/01mfj",
"score" : 0.74227184,
"description" : "computer hardware"
},
{
"mid" : "\/m\/0541p",
"score" : 0.7062791,
"description" : "multimedia"
},
{
"mid" : "\/m\/07c1v",
"score" : 0.7039645,
"description" : "technology"
},
{
"mid" : "\/m\/03gq5hm",
"score" : 0.69323385,
"description" : "font"
},
{
"mid" : "\/m\/0bs7_0t",
"score" : 0.6724673,
"description" : "electronic device"
},
{
"mid" : "\/m\/01vdm0",
"score" : 0.66489816,
"description" : "electronic keyboard"
},
{
"mid" : "\/m\/0121tl",
"score" : 0.60392517,
"description" : "electronic instrument"
},
{
"mid" : "\/m\/0h8n5_7",
"score" : 0.5834592,
"description" : "laptop replacement keyboard"
}
]
}
]
}
代码显示所有JSON响应
// Use SwiftyJSON to parse results
let json = JSON(data: dataToParse)
let errorObj: JSON = json["error"]
// Parse the response
print(json)
let responses: JSON = json["responses"][0]
// Get label annotations
let labelAnnotations: JSON = responses["labelAnnotations"]
let numLabels: Int = labelAnnotations.count
var labels: Array<String> = []
if numLabels > 0 {
var labelResultsText:String = "Labels found: "
for index in 0..<numLabels {
let label = labelAnnotations[index]["description"].stringValue
labels.append(label)
}
for label in labels {
// if it's not the last item add a comma
if labels[labels.count - 1] != label {
labelResultsText += "\(label), "
} else {
labelResultsText += "\(label)"
}
}
self.labelResults.text = labelResultsText
} else {
self.labelResults.text = "No labels found"
}
修改
我显然无法回答我自己的问题,我会发布一个编辑,因为我认为这是一个更好的解决方案但是@ pierce对于一个单词来说相当不错,而不是很多;它只是不适用于游戏设置应用程序。
所以,我创建了一个新的NSObject,创建了一个
static var _words: [[String]] = [
["apple", computer", "beer"]]
然后
func checkAnnotations(annotations: [Annotation]) -> Bool {
var isMatched = false
let searchWords = self.words
for searchWord in searchWords {
for annotation in annotations {
if searchWord == annotation.descriptionString {
isMatched = true
break
}
}
if isMatched {
break
}
}
return isMatched
}
然后创建了一个处理水平状态的函数,
并最终将其与View Controller中的JSON响应进行了比较,如果匹配则为
// Get JSON key value
let labelAnnotations = responses["labelAnnotations"].arrayValue
let annotationObjects: [Annotation] = labelAnnotations.flatMap({ annotationDictionary in
if let mid = annotationDictionary["mid"].string,
let score = annotationDictionary["score"].double,
let description = annotationDictionary["description"].string {
let annotation = Annotation(mid: mid, score: score, descriptionString: description)
return annotation
}
return nil
})
//print(annotationObjects)
let searchString = LevelState.shared.words[0]
print("Level \(LevelState.shared.level), looking for: \(searchString)")
var isMatched = LevelState.shared.checkAnnotations(annotations: annotationObjects)
if isMatched {
LevelState.shared.advance()
}
let alertTitle = isMatched ? "Congrats! You got \(searchString)" : "Keep looking for \(searchString)"
//let translationResult = "Translated: \(levelDescription) to \(translatedText)"
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
self.present(alertController, animated: true, completion: nil)
}
self.prepareForNewLevel()
})
}
答案 0 :(得分:0)
第一件事 - 我真的不明白你为什么要在每个描述的末尾添加一个逗号。我真的没必要。你是否对分离数组中的元素感到困惑?因为实际的String
不需要,只有当你手动写出数组的元素时(即let array = ["a", "b", "c"]
)。
然后说你为这个labels
数组设置了一个属性,这是一个String
的数组。
var labels: Array<String> = []
一旦您完成并附加了description
中的所有JSON
值,您就可以对其进行操作。
if numLabels > 0 {
for index in 0..<numLabels {
let label = labelAnnotations[index]["description"].stringValue
labels.append(label)
}
}
现在你可以根据一些用户输入的单词创建一个返回过滤后的数组String
的方法:
func findMatches(_ userEntry: String) -> [String] {
return labels.filter { $0.contains(userEntry) }
}
现在您可以使用上述方法来处理某种类型的用户输入,例如说您拥有来自名为UITextField
的{{1}}的文字:
textField
现在,如果您// Return the filtered matches based on the textField text (unless nil)
let matches = findMatches(textField.text ?? "")
// Print the number of matches, and also show the matches
print("Found \(matches.count) matches to user input\r\(matches)")
持有labels
,并运行上面代码["a", "aa", "ba", "b", "c", "apple"]
只是字母“a”,您会在控制台中看到此打印件窗口:
userEntry
编辑 - 您可以使用上面的Found 4 matches to user input
["a", "aa", "ba", "apple"]
方法来尝试使用预定字词进行匹配。我不确定你究竟要做什么,但有几种不同的方式。首先,假设你有一系列你想要检查为数组的预定词:
findMatches
然后你可以循环检查并检查每一个
let words = ["word", "verb", "noun", "adverb"]
如果您只想查看特定字词并获得特定答案,可以设置如下方法:
for word in words {
let matches = findMatches(word)
if matches.count > 0 {
print("Found \(matches.count) matches to \(word)\r\(matches)")
} else {
// Do whatever you want when there are no matches
print("No matches found")
}
}
有很多方法可以实现这一点。您还可以使用func checkWord(word: String, noMatchResponse: String) {
let matches = findMatches(word)
if matches.count > 0 {
print("Found \(matches.count) matches to \(word)\r\(matches)")
} else {
// Do whatever with the no match response
print(noMatchResponse)
}
}
语句,然后对每个预定义词使用不同的switch
语句。这取决于你以及你想如何设计你的游戏。