如何声明具有两种可能类型的变量

时间:2018-11-23 13:57:59

标签: swift uitableview core-data scope

我有两个Core Data entities,其中一个UITableView包含2个部分,每个部分一个实体。当用户点击表行时,他们将被定向到另一个视图,该行的数据被发送到该视图。当前是这样实现的:

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
}

理想情况下,我希望这样做而不为每个实体创建单独的视图,但是如果其他解决方案更好,更现实,我愿意重构。谢谢

1 个答案:

答案 0 :(得分:1)

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

在EditValuesViewController的代码中,询问send_array以确定传入的数据对象类型。

编辑:

定义协议

@protocol dataArrayProtocol {
  var dataArray: Array
}

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

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

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

给您的EditValuesViewController一个符合该协议的属性     class 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编辑器中敲出了这段代码,但尚未尝试对其进行编译。我可能犯了一些小错误。它应该会给你这个主意。