我正在尝试在swift中处理一些Euler项目的问题。
我最初尝试使用操场,但发现速度非常慢,所以我制作了一个简单的单视图应用程序,可以在模拟器中为我运行它们。请参见下面的示例:
我这样做的方式是创建一个名为
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"]
}
}