2017-05-25 1 views
2

Aujourd'hui, je trouve un morceau maladroit de code:Est-il possible de déstructurer un objet dans un commutateur?

if segue.identifier == "settings" { 
    if let settingsController = segue.destination as? SettingsController 
    { 
    //...setup settings controller here 
    } 
} else if segue.identifier == "mocks" { 
    if let mocksController = segue.destination as? MocksController 
    { 
    //...setup mocks controller here controller here 
    } 
} 
//... and a lot of if-elses 

Je déteste vraiment avoir if-else-if dans mon code et décider de factoriser cette pièce avec switch. Malheureusement, ma connaissance de boniment en correspondance rapide sont très limitées, donc le mieux que je puisse faire est:

switch segue.identifier! { 
    case "mocks" where segue.destination is MocksController: 
    let mocksController = segue.destination as! MocksController 
    // do corresponding staff here 
    break 

    case "settings" where segue.destination is SettingsController: 
    let settingsController = segue.destination as! SettingsController 
    // do corresponding staff here 
    break 
} 

Je me demande est-il possible d'extraire identifier et destination propriétés de segue objet en utilisant comme modèle de correspondance en pseudo -code ci-dessous:

switch segue { 
    case let destination, let identifier where destination is ... && identifier == "...": 
    //do somthing 
    break 
} 
+1

Je ne crois pas qu'il est actuellement possible d'extraire directement les valeurs de propriété dans un modèle donné - vous pouvez toujours simplement passer au-dessus de '(segue.identifier, segue.destination)' bien. – Hamish

Répondre

5

OUI, c'est tout à fait possible. Swift est puissant;)

switch (segue.identifier, segue.destination) { 
    case let ("mocks"?, mocksController as MocksController): 
      // do corresponding stuff here 
    ... 
}