swift - 如何声明具有两种可能类型的变量
问题描述
我有两个用 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
}
}
}
问题:
由于有两个实体,因此发送到下一个视图的数据有两种可能的类型 (Income
和Expenses
)。如何在具有一个变量的下一个视图中使用该数据?我正在执行以下操作,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
}
理想情况下,我希望在不为每个实体结果创建单独视图的情况下执行此操作,但如果另一种解决方案更好、更现实,我愿意重构。谢谢
解决方案
使您的两种类型的数据对象符合共享协议。使目标视图控制器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 编辑器中敲出了这段代码,并没有尝试编译它。我可能犯了一些小错误。它应该给你的想法。
推荐阅读
- javascript - Jest - 为特定测试模拟来自模块的常量属性
- heroku - 没有使用 procfile 设置目录根目录
- sql - 带有 aaa% 的 SQL LIKE 运算符具有奇怪的行为
- c# - Linq 不等于返回 wpf datagrid 中的所有值
- java - 为其他类创建对象
- native-base - 无法在 react-native-web 应用程序中运行本机基础组件
- angular - 无法动态显示数据表中的数据。(角6)
- sublimetext3 - Sublime text:通过单击节点并搜索完整的树路径来获取完整的yaml树路径
- highcharts - 有没有办法使用 Highcharts 创建和弦图
- android - 具有共享视图模型的 Android 导航组件