Swift中如何通过拼接字符串或变量来访问关联的作业列表变量?
用字典替代单独变量,优雅解决动态作业列表访问问题
嘿,我完全懂你想实现的功能——根据用户选中的课程动态展示对应作业列表,不想为每个科目都写重复的ViewController。直接通过字符串拼接变量名的方式在Swift里确实走不通,因为Swift是静态类型语言,没办法动态通过字符串访问变量。不过咱们换个思路,用字典就能完美解决这个问题,而且代码会更简洁易维护!
第一步:把分散的作业变量换成字典
你原来的Languagehw、Mathhw这些单独变量,都可以放进一个字典里,让课程名称直接对应到它的作业列表:
@IBOutlet var className: UILabel! // 用字典关联课程名和作业列表,比单独变量好用太多 var homeworkDict: [String: [String]] = [ "Language": ["hi", "bye", "New Assignment . . .", "Remove Assignment . . ."], "Math": ["him", "bye", "New Assignment . . .", "Remove Assignment . . ."], "English": ["hime", "bye", "New Assignment . . .", "Remove Assignment . . ."] ] // 课程列表直接从字典的keys里生成,不用手动维护两个地方 var classList: [String] { return Array(homeworkDict.keys) }
第二步:在didSelectRowAt里动态获取作业列表
当用户选中某门课程时,直接用选中的课程名从字典里取对应的作业列表就行,完全不用拼接字符串:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedClass = classList[indexPath.row] className.text = selectedClass // 直接拿到对应的作业列表,安全又方便 if let selectedHomework = homeworkDict[selectedClass] { // 这里就可以用selectedHomework来更新你的作业展示TableView了 // 比如给作业列表的数据源赋值,然后刷新tableView self.homeworkDataSource = selectedHomework self.homeworkTableView.reloadData() } }
第三步:优化addAssignment函数
原来的循环判断可以直接删掉,用字典的键值访问就能快速定位到对应科目:
func addAssignment(subject: String) { // 先检查字典里有没有这个科目,避免崩溃 guard var homeworkList = homeworkDict[subject] else { print("找不到对应的科目哦") return } // 这里添加新作业的逻辑,比如插入到"New Assignment..."前面 homeworkList.insert("你的新作业内容", at: homeworkList.count - 2) // 把更新后的列表存回字典 homeworkDict[subject] = homeworkList // 刷新作业TableView,让新作业显示出来 homeworkTableView.reloadData() }
为什么用字典更好?
- 避免拼写错误:不用手动拼接字符串找变量,直接用课程名当键,Swift会帮你做类型检查
- 易维护:以后要加新科目,直接往字典里加一组键值对就行,不用额外定义新变量
- 代码更简洁:省去了一堆重复的变量定义和循环判断逻辑,可读性拉满
内容的提问来源于stack exchange,提问作者Swaraag
相关产品推荐
相关产品推荐

