使用Swift中的String将Class赋值给变量

时间:2018-05-09 23:13:13

标签: ios swift class

我正试图在swift中做一些项目Euler问题。 我最初尝试使用Playground,但发现速度非常慢,所以我做了一个简单的单一视图应用程序,它将在模拟器中为我运行它们。请参阅下面的示例:

enter image description here

我这样做的方式是我创建了一个名为ProblemClass的客户类,然后为从该类继承的每个问题创建一个新类。之后,我所要做的就是覆盖ProblemClass中的函数,然后View Controller只会加载Problem1ProblemClass继承的类中的所有信息。

当它从Problem1(或任何其他问题)加载到视图时,它会通过我在segue期间设置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
    }
}

有没有办法用问题#()分配字符串,所以我不必制作数百个这样的案例?我不知道它会是什么样子,并试图谷歌继续回答关于#selectors的答案。我不知道它到底会是什么样子,但在我看来,我在想这样的事情。

destination.currentProblem = Class(name: "Problem4")

如果我问的问题不明确,请告诉我,我会尝试更好地解释。 提前谢谢!

--- --- EDIT 从下面的选定答案添加我的解决方案。

所以我将prepare函数更改为:

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 :(得分:1)

也许:

let problemNumber: Int = 1
var className = "AppName.Problem\(problemNumber)"
let problemClass = NSClassFromString(className) as! Problem.Type
destination.currentProblem = problemClass