代码之家  ›  专栏  ›  技术社区  ›  Jason Brady

用Swift中的字符串将类分配给变量

  •  0
  • Jason Brady  · 技术社区  · 6 年前

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

    enter image description here

    我这样做的方式是创建一个名为 ProblemClass 然后我为继承自该类的每个问题创建一个新类。之后,我所要做的就是重写 问题类别 然后视图控制器只加载 Problem1 继承自的类 问题类别

    当它切换到从 问题1 (或任何其他问题),它通过设置 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
        }
    }
    

    有没有办法用一个字符串来分配问题#(),这样我就不必处理成百上千个这样的情况?我不知道它会是什么样子,尝试在谷歌上搜索时不断返回关于#选择器的答案。我不知道它到底是什么样子,但在我的脑海里,我在想这样的事情。

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

    如果我的问题不清楚,请告诉我,我会尽力更好地解释。 提前感谢您!

    ---编辑--- 从下面选择的答案中添加我的解决方案。

    因此,我将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() 在我的 问题类别 我让我的班级看起来像这样:

    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 回复  |  直到 6 年前
        1
  •  1
  •   barnabus    6 年前

    也许:

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