2015-03-12 2 views
0

Я недавно начал кодирование для 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

Извините за медленный ответ. Я изменил свой код, так как это работает, и я доволен тем, как он работает. Вопросы в будущем будут заполняться через Интернет через петлю.

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 

Итак, мой граф Вопрос ier заключался в выполнении функций в массиве, который, как я узнал, мне не нужно было делать. Но, по крайней мере, я ответил так, что у него могут быть и другие, которым нужен аналогичный код :)

1

Код:

"functionName": generalknowledgeLibrary() 

Наборы "functionName" в результате вызова функции.

Использование:

"functionName": generalknowledgeLibrary 
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 
} 
0

я сделал код на этот вопрос, используя индекс

Я создал коллекцию класса для управления вопросом. Я считаю, что решение friend просто remove() проще и правильнее, но я создал этот класс, чтобы дополнить свои исследования, потому что мне нравится вводить здесь, чтобы попробовать новые решения.

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"](); 
Смежные вопросы