首页 > 解决方案 > 如何声明具有两种可能类型的变量

问题描述

我有两个用 2 个部分Core Data entities填充 a UITableView,每个部分一个实体。当用户点击表格行时,他们会被定向到发送该行数据的另一个视图。它目前是这样实现的:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "editValue") {
        let secondViewController = segue.destination as! EditValuesViewController

        if send_array_inc.isEmpty {
            secondViewController.send_array_exp = send_array_exp
        } else if send_array_exp.isEmpty {
            secondViewController.send_array_inc = send_array_inc
        }
    }
}

问题:

由于有两个实体,因此发送到下一个视图的数据有两种可能的类型 (IncomeExpenses)。如何在具有一个变量的下一个视图中使用该数据?我正在执行以下操作,ViewDidLoad但范围send_array仍在该功能内。我怎样才能send_array在外面提供?

if send_array_inc.isEmpty {
     var send_array = [Expenses]()
     send_array = send_array_exp
} else if send_array_exp.isEmpty {
     var send_array = [Income]()
     send_array = send_array_inc
}

理想情况下,我希望在不为每个实体结果创建单独视图的情况下执行此操作,但如果另一种解决方案更好、更现实,我愿意重构。谢谢

标签: swiftuitableviewcore-datascope

解决方案


使您的两种类型的数据对象符合共享协议。使目标视图控制器send_array成为符合该协议的对象。

在 EditValuesViewController 的代码中,查询send_array以找出传入的数据对象类型。

编辑:

定义协议

@protocol dataArrayProtocol {
  var dataArray: Array
}

定义 2 个符合该协议的结构

struct ExpensesArrayStruct: dataArrayProtocol {
  var dataArray: [Expenses]
}

struct IncomeArrayStruct: dataArrayProtocol {
  var dataArray: [Income]
}

给你EditValuesViewController一个符合该协议类的属性 EditValuesViewController: UIViewController { var dataArrayStruct: dataArrayProtocol }

还有你的prepare(for:sender)方法

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "editValue") {
        let secondViewController = segue.destination as! EditValuesViewController

        if send_array_inc.isEmpty {
            secondViewController.dataArrayStruct = ExpensesArrayStruct(dataArray: send_array_exp)
        } else if send_array_exp.isEmpty {
            secondViewController.dataArrayStruct = IncomeArrayStruct(dataArray: send_array_inc)
        }
    }
}

并处理数据:

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  if let expensesStruct = dataArrayStruct as? ExpensesArrayStruct {
     //deal with expenses array
  } else if let incomeStruct = dataArrayStruct as? IncomeArrayStruct {
     //deal with income array
  }
}

请注意,我在 SO 编辑器中敲出了这段代码,并没有尝试编译它。我可能犯了一些小错误。它应该给你的想法。


推荐阅读