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

标签 swift uitableview core-data scope

我有两个 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/

相关文章:

objective-c - iOS - 如何刷新/更新核心数据 transient 属性?

mysql - 同一请求中同一类型对象的唯一标识符

swift - 方便的可失败初始化器分配 self

ios - 当元素被激活时如何获取indexpath.row?

ios - 为什么我的代码没有删除字符串的空格?

objective-c - 两个 UITableView 单元格/部分之间的黑色边框

objective-c - 安装 cocoapods "sudo gem install cocoapods"MacOs Catalina 时出错

ios - 在两个不同的类中对同一文件使用委托(delegate)

ios - 标签栏应用程序中的 iAd 横幅

ios - 应用程序从本地存储切换到远程存储时的 iCloud 通知