Swift如何创建多值数据结构并实现控制器间传值
Swift多值数据结构定义与页面传值实现
一、修正多值存储的数据结构
你当前的代码存在两处语法问题:
- 字符串数组声明写法不规范,
(String)[]不符合Swift语法,标准字符串数组类型为[String] - 初始化
faculties时未使用自定义结构体类型,且属性名拼写错误(结构体中定义的是descriptions,初始化时写为description缺失后缀s) - 补充Swift命名规范:结构体名使用大驼峰格式,和属性、变量的小驼峰做区分,避免后续开发混淆
修正后可正常存储多值的代码如下:
struct Faculty { var name: String // 字符串数组类型,支持存储任意数量的描述文本 var descriptions: [String] } // 初始化数据源数组,每个元素都是Faculty结构体实例 let faculties = [ Faculty(name: "Faculties", descriptions: ["Study1", "Study2"]) ]
这个数据源和你之前展示
["Test1", "Test2"]的tableView逻辑完全兼容,只需要在cell配置时取对应实例的name属性展示即可。
二、实现UITableViewController到目标控制器的值传递
正向传值直接使用系统提供的跳转回调方法即可,分两种场景:
场景1:使用Storyboard/Segue跳转
- 先在目标ViewController中声明用于接收值的存储属性:
class DetailViewController: UIViewController { // 接收多值描述数组 var receivedDescriptions: [String]? // 可选:接收对应条目的名称 var facultyName: String? override func viewDidLoad() { super.viewDidLoad() // 视图加载完成后即可使用传入的值,比如赋值给列表、文本控件 debugPrint("成功拿到描述数据:\(receivedDescriptions ?? [])") } }
- 在UITableViewController中实现跳转传值逻辑:
class FacultyListTableViewController: UITableViewController { // 数据源,即前面定义的faculties数组 let faculties = [ Faculty(name: "Faculties", descriptions: ["Study1", "Study2"]) ] override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 校验跳转标识、目标控制器类型、选中行位置,和Storyboard中设置的segue ID保持一致 guard segue.identifier == "showFacultyDetail", let targetVC = segue.destination as? DetailViewController, let selectedIndexPath = tableView.indexPathForSelectedRow else { return } // 取出选中行对应的数据 let selectedItem = faculties[selectedIndexPath.row] // 给目标控制器的属性赋值 targetVC.facultyName = selectedItem.name targetVC.receivedDescriptions = selectedItem.descriptions } }
场景2:纯代码跳转
如果是通过代码手动push/present控制器,直接在cell点击回调中传值即可:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedItem = faculties[indexPath.row] let targetVC = DetailViewController() // 直接赋值 targetVC.receivedDescriptions = selectedItem.descriptions targetVC.facultyName = selectedItem.name // 跳转 navigationController?.pushViewController(targetVC, animated: true) }
注意事项
- 不要在传值阶段直接操作目标控制器上的UI控件(比如UILabel、UITableView),此时目标控制器的视图尚未加载,控件为nil会导致赋值失败,仅需要把值传给存储属性,等目标控制器自身
viewDidLoad生命周期触发后再做UI赋值操作。 - Swift中结构体、数组都是值类型,正向传值后对数据的修改不会影响原列表的数据源,如果需要反向传值(比如详情页修改数据回传给列表页),可以使用代理、闭包或者通知实现,当前正向传值场景上述方法完全满足需求。
内容的提问来源于stack exchange,提问作者Codingman11
相关产品推荐
相关产品推荐

