You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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跳转

  1. 先在目标ViewController中声明用于接收值的存储属性:
class DetailViewController: UIViewController {
    // 接收多值描述数组
    var receivedDescriptions: [String]?
    // 可选:接收对应条目的名称
    var facultyName: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 视图加载完成后即可使用传入的值,比如赋值给列表、文本控件
        debugPrint("成功拿到描述数据:\(receivedDescriptions ?? [])")
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:57:20