运行存储在数组中的函数 - Swift

时间:2015-03-12 23:33:16

标签: arrays swift

我最近开始编写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的函数。

提前谢谢。

4 个答案:

答案 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

所以,我之前的问题是关于在数组中运行函数,我知道我不需要这样做。但至少我已经回答了,可能有其他人需要类似的代码:)