Присвойте класс переменной с помощью строки в Swift - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь решить некоторые из проблем проекта Эйлера по-быстрому. Первоначально я пытался использовать игровую площадку, но обнаружил, что это невероятно медленно, поэтому вместо этого я создал простое приложение для одного вида, которое будет запускать их для меня в симуляторе. Смотрите мой пример ниже:

enter image description here

То, как я это сделал, я сделал класс клиента с именем 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"]
}
}

1 Ответ

0 голосов
/ 10 мая 2018

Возможно:

let problemNumber: Int = 1
var className = "AppName.Problem\(problemNumber)"
let problemClass = NSClassFromString(className) as! Problem.Type
destination.currentProblem = problemClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...