Я пытаюсь решить некоторые из проблем проекта Эйлера по-быстрому.
Первоначально я пытался использовать игровую площадку, но обнаружил, что это невероятно медленно, поэтому вместо этого я создал простое приложение для одного вида, которое будет запускать их для меня в симуляторе. Смотрите мой пример ниже:
То, как я это сделал, я сделал класс клиента с именем ProblemClass
, а затем я создаю новый класс для каждой проблемы, которая наследуется от этого класса. После этого все, что мне нужно сделать, это переопределить функции в ProblemClass
, а затем View Controller просто загружает всю информацию из класса Problem1
, унаследованного от ProblemClass
.
Когда он переходит к представлению, которое загружается из Problem1
(или к любой другой проблеме), он получает подробности, устанавливая переменную currentProblem
во время сеанса. см. ниже
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destination = segue.destination as! ProblemVC
let cell = sender as! ProblemsTVCell
let label = cell.label!
switch label.text! {
case "Problem 1":
destination.currentProblem = Problem1()
case "Problem 2":
destination.currentProblem = Problem2()
case "Problem 3":
destination.currentProblem = Problem3()
case "Problem 4":
destination.currentProblem = Problem4()
default:
break
}
}
Есть ли способ назначить задачу # () строкой, поэтому мне не нужно создавать сотни таких случаев? Я понятия не имею, на что это было бы похоже, и попытка Google продолжала возвращать ответы о #selectors. Я не знаю, как это будет выглядеть на самом деле, но я думаю, что-то вроде этого.
destination.currentProblem = Class(name: "Problem4")
Дайте мне знать, если то, что я спрашиваю, неясно, и я постараюсь объяснить лучше.
Заранее спасибо!
--- EDIT ---
Добавление в мое решение от выбранного ответа ниже.
Итак, я изменил функцию подготовки к этому:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destination = segue.destination as! ProblemVC
let cell = sender as! ProblemsTVCell
let label = cell.label!
let problemName = label.text!.replacingOccurrences(of: " ", with: "")
let problemClass = NSClassFromString("Project_Euler.\(problemName)")! as! ProblemClass.Type
destination.currentProblem = problemClass.init()
}
И чтобы получить init()
в моем ProblemClass
, я сделал мой класс таким:
class ProblemClass {
required init() {
return
}
func title() -> String {
return "Title"
}
func problem() -> String {
return "Problem #"
}
func question() -> [String] {
return ["No Question Yet"]
}
func answer() -> [String] {
return ["No Answer Code Entered Yet"]
}
}