将不同子 类 的实例传递给 Swift 中的另一个 ViewController 3

passing instance of different sub classes onto another ViewController in Swift 3

我正在尝试将已创建用户的实例传递给另一个视图控制器。问题是传递的用户取决于选择的用户类型。我的意思是我已经创建了许多 sub-class 的主要 class 用户。因此,例如:Guest、VIP、Child 等,因此当在第一页上创建实例时,它是为该用户创建的子 class。在没有将第二个视图控制器用户 属性 设置为类型用户的情况下,我无法理解如何将用户传递给第二个视图控制器。问题是类型 User 不具有子 classes 具有的所有属性,因此在第二页中我无法访问子 class 可能具有的所有属性。这是我目前如何设置的示例:

第一个屏幕/视图控制器

var entrantData: People? 
var entrantSelected: EntrantType = .none

@IBAction func generatePass(_ sender: UIButton) {
    do{
switch entrantSelected {
        case .freechildguest: entrantData = try Child(dateOfBirth: "\(dobTextField.text!)")
        case .classicguest: entrantData = ClassicGuest()
        case .maintenance: entrantData = try Maintenance(NameAddress(firstName: firstNameTextField.text, lastName: lastNameTextField.text, streetAddress: streetAddressTextField.text, city: cityTextField.text, state: stateTextField.text, zipCode: zipCodeTextField.text, entrantType: .maintenance))
        default: break 
        }
} catch let error {
        showAlert(title: "Error", message: "\(error)")
}

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destViewController = segue.destination as? TicketViewController {
        destViewController.dataFromForm = entrantData 
    }
}

第二个屏幕/视图控制器

class TicketViewController: UIViewController {
var dataFromForm: People?

所以在第二个视图控制器中,我现在在 dataFromForm 中拥有用户数据,但我希望它位于其子 class 中,这样我可以获得仅在其子 class 中划分的属性.例如。维护用户的名字 属性 而 child 和 classicGuest 没有。

我想我可以创建 sub class 在 User super class 中使用的所有属性,但我觉得创建具有自己独特属性的 sub classes 没有意义.

解决此问题的一种方法是将 People 类型的 属性 保留在 TicketViewController 上,并在尝试访问仅特定子类的 属性 时有,尝试有条件地将 People 实例向下转换为适当的子类。

下面是一个基本示例,说明如何实现此目的:

if let vip = dataFromForm as? VIP {
   //access VIP properties
} else if let guest = dataFromForm as? Guest {
   //access guest properties
}

您可以做的另一件事是向下转换为协议本身。当有多个子类符合同一协议时,这在某些情况下可能会更容易。

if let entrant = entrantData as? Nameable {
    fullNameLabel.text = entrant.fullName
}

所以上面的代码不会在 child 或 classicGuest 上执行,因为它们不符合 Nameable 协议。