是否可以在开关操作器中对对象进行解构?

And*_*nko 2 pattern-matching swift

今天我发现了一段笨拙的代码:

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
Run Code Online (Sandbox Code Playgroud)

我真的很讨厌if-else-if在我的代码中决定重构这篇文章switch.不幸的是,我对快速模式匹配的了解非常有限,所以我能做的最好的事情是:

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
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以使用模式匹配从对象中提取identifierdestination属性,segue如下面的伪代码:

switch segue {
  case let destination, let identifier where destination is ... && identifier == "...": 
  //do somthing 
  break
}
Run Code Online (Sandbox Code Playgroud)

Las*_*ove 6

是的,这完全有可能.斯威夫特是强大的;)

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