我最近开始编写iOS并使用Swift。我正在尝试为练习构建一个小测验应用程序。但是,我在运行存储在数组中的函数时遇到问题。
我的问题库swift文件如下:
func getQuestionLibrary() -> NSArray {
var questionLibrary = [
[
"categoryName": "General Knowledge",
"functionName": generalknowledgeLibrary()
]]
如您所见,它说明了类别并存储了一个功能。
我的代码运行正常,使用此数组(有更多条目)动态创建可供选择的类别列表。运行类别时,它会执行segue并移动到视图上以显示类别。
如果我在应用程序运行良好的类别中进行硬编码:
if playQuestionLibraryText == "General Knowledge" {
questionPack = generalknowledgeLibrary()
} else if playQuestionLibraryText == "Music" {
questionPack = musicLibrary()
} else if playQuestionLibraryText == "Film" {
questionPack = filmLibrary()
}
但是,由于列表是动态的,我希望不要硬编码。
请帮助我允许我的代码搜索数组,并在选择了正确的类别时运行存储为数组中functionName的函数。
提前谢谢。
答案 0 :(得分:1)
代码:
"functionName": generalknowledgeLibrary()
将"functionName"
设置为调用函数的结果。
使用:
"functionName": generalknowledgeLibrary
答案 1 :(得分:0)
你正在寻找一个图书馆'根据其名称;使用Dictionary
。您的图书馆'将持有一些东西(因为库不会这样做)并允许一些行为 - 因此将其作为抽象来捕获。
class Library { // maybe this is a 'questionPack'
// stuff in a library // that is okay, change the name
}
var libraryMap : [String:Library] =
["Music": Library(/*...*/),
"Film" : Library(/*...*/),
"General Knowledge" : Library(/*...*/)
// ....
]
if let library = libraryMap[playQuestionLibraryText] {
// do something with the library
}
答案 2 :(得分:0)
我使用下标
为这个问题做了一个代码我创建了一个类集合来管理您的问题。我相信朋友解决方案只是删除()更容易和正确,但我创建这个类来补充我的研究,因为我喜欢进入这里尝试新的解决方案。
class QuestionCollection
{
struct QuestionItem {
var categoryName:String;
var function:()->Void //Here can add return type you need
}
private var dicCallbacks:[String:QuestionItem] = [String:QuestionItem]();
func add(categoryName:String, closure:()->Void //Here can add return type you need )
{
dicCallbacks[categoryName] = QuestionItem(categoryName: categoryName, function: closure);
}
subscript(categoryName:String)->()->Void //Here can add return type you need
{
get
{
if let callback = self.dicCallbacks[categoryName]
{
return callback.function;
}
return error;
}
set
{
dicCallbacks[categoryName] = QuestionItem(categoryName: categoryName, function: newValue);
}
}
func error()->Void
{
println("error try catch closure function")
}
}
如何使用此类
func musicTest()
{
println("test Music");
}
func musicGK()
{
println("test Music");
}
func musicFilm()
{
println("test Music");
}
var questionCollection = QuestionCollection();
questionCollection["Music"] = musicTest
questionCollection["General Knowledge"] = musicGK
questionCollection["Film"] = musicFilm
questionCollection["Music"]();
questionCollection["General Knowledge"]();
questionCollection["Film"]();
答案 3 :(得分:0)
抱歉回复缓慢。我改变了我的代码,因为它的工作原理,我很高兴它是如何工作的。 未来的问题将通过互联网循环填充。
struct Question {
var categoryName : String
var questionTitle : String
var answerA : String
var answerB : String
var answerC : String
var answerD : String
var correct : String
}
public struct QuestionLibrary {
var questions: [Question]
}
let QuizQuestions =
QuestionLibrary(
questions: [
Question(
categoryName: "General Knowledge",
questionTitle: "Question 1",
answerA: "A", answerB: "B", answerC: "C", answerD: "D", correct: "D"),
Question(
categoryName: "Music",
questionTitle: "Question 2",
answerA: "A", answerB: "B", answerC: "C", answerD: "D", correct: "A"),
Question(
categoryName: "Film",
questionTitle: "Question 3",
answerA: "A", answerB: "B", answerC: "C", answerD: "D", correct: "B")
])
然后我的代码根据类别检索问题:
let questionLibrary = QuizQuestions.questions
var questionPack: Array<Question>?
questionPack = questionLibrary.filter({c in c.categoryName == "Music" })
然后我选择一个随机问题
let question = questionPack![randomNumber]
显示问题文本
question.questionTitle
所以,我之前的问题是关于在数组中运行函数,我知道我不需要这样做。但至少我已经回答了,可能有其他人需要类似的代码:)