我有两个 Core Data 实体
,它们填充了一个包含 2 个部分的 UITableView
,每个部分一个实体。当用户点击表格行时,他们将被定向到另一个 View ,该行的数据将被发送到该 View 。目前是这样实现的:
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
}
}
}
问题:
因为有两个实体,所以发送到下一个 View 的数据有两种可能的类型(收入
和支出
)。如何在下一个 View 中使用一个变量使用该数据?我在 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
}
理想情况下,我希望在不为每个实体创建单独的 View 结果的情况下执行此操作,但如果另一个解决方案更好、更现实,我愿意重构。谢谢
最佳答案
使您的两种类型的数据对象符合共享协议(protocol)。使目标 View Controller 的 send_array
成为符合该协议(protocol)的对象。
在您的 EditValuesViewController 代码中,查询 send_array
以确定传入的数据对象类型。
编辑:
定义协议(protocol)
@protocol dataArrayProtocol {
var dataArray: Array
}
定义 2 个符合该协议(protocol)的结构
struct ExpensesArrayStruct: dataArrayProtocol {
var dataArray: [Expenses]
}
struct IncomeArrayStruct: dataArrayProtocol {
var dataArray: [Income]
}
为您的 EditValuesViewController
提供一个符合该协议(protocol)的属性
类 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 编辑器中敲出了这段代码,并没有尝试编译它。我可能犯了一些小错误。不过,它应该会给您灵感。
关于swift - 如何声明具有两种可能类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53448053/