【问题标题】:Convert if else structure into switch case in swift快速将 if else 结构转换为 switch case
【发布时间】:2016-10-11 06:27:36
【问题描述】:

我是编程新手,我正在尝试将这种 if else 结构转换为 Swift 语言的 Switch 案例,感谢您的帮助,谢谢。

这是我的代码

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "ShowDefinition") {
        if let destinationViewController = segue.destinationViewController as? EnglishViewController {
            if let definition = sender as? String {
                if definition == "Abstraction" {
                    destinationViewController.titleMsg = "Abstraction"
                    destinationViewController.definitionMsg = "definition 1"
                } else if definition == "Binary System" {
                    destinationViewController.titleMsg = "Binary System"
                    destinationViewController.definitionMsg = "definition 2"
                } else if definition == "Computer" {
                    destinationViewController.titleMsg = "Computer"
                    destinationViewController.definitionMsg = "definition 3"

                } else if definition == "Internet" {
                    destinationViewController.titleMsg = "Internet"
                    destinationViewController.definitionMsg = "definition 4"

                } else if definition == "Virtual Reality" {
                    destinationViewController.titleMsg = "Virtual Reality"
                    destinationViewController.definitionMsg = "definition 5"

                }
            }
        }
    }
}

【问题讨论】:

    标签: ios swift if-statement switch-statement


    【解决方案1】:

    类似这样的:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "ShowDefinition") {
            if let destinationViewController = segue.destinationViewController as? EnglishViewController {
                if let definition = sender as? String {
                    switch definition {
                    case "Abstraction":
                        destinationViewController.titleMsg = "Abstraction"
                        destinationViewController.definitionMsg = "definition 1"
                    case "Binary System":
                        destinationViewController.titleMsg = "Binary System"
                        destinationViewController.definitionMsg = "definition 2"
                    case "Computer":
                        destinationViewController.titleMsg = "Computer"
                        destinationViewController.definitionMsg = "definition 3"
                    case "Internet":
                        destinationViewController.titleMsg = "Internet"
                        destinationViewController.definitionMsg = "definition 4"
                        destinationViewController.titleMsg = "Abstraction"
                        destinationViewController.definitionMsg = "definition 1"
                    case "Virtual Reality":
                        destinationViewController.titleMsg = "Virtual Reality"
                        destinationViewController.definitionMsg = "definition 5"
                    default:
                        destinationViewController.titleMsg = ""
                        destinationViewController.definitionMsg = ""
                    }
                }
            }
        }
    }
    

    检查你想对default 值做什么,如果没有一个case 匹配,就会被命中。

    【讨论】:

      【解决方案2】:

      由于titeMsg 将始终包含definition 字符串,因此您可以使代码更短

      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ShowDefinition" {
          if let destinationViewController = segue.destinationViewController as? EnglishViewController {
            if let definition = sender as? String {
              switch definition {
              case "Abstraction":
                destinationViewController.definitionMsg = "definition 1"
              case "Binary System":
                destinationViewController.definitionMsg = "definition 2"
              case "Computer":
                destinationViewController.definitionMsg = "definition 3"
              case "Internet":
                destinationViewController.definitionMsg = "definition 4"
              case "Virtual Reality":
                destinationViewController.definitionMsg = "definition 5"
              default :
                destinationViewController.definitionMsg = "n/a"
      
              }
              destinationViewController.titleMsg = definition
            }
          }
        }
      }
      

      你可以更进一步,声明一个案例的枚举

      enum Definitions : String {
        case Abstraction, BinarySystem = "Binary System", Computer, Internet, VirtualReality = "Virtual Reality"
      }
      

      这会保存default 语句,因为案例是详尽的。

      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "ShowDefinition") {
          if let destinationViewController = segue.destinationViewController as? EnglishViewController {
            if let definition = sender as? String, let definitionEnum = Definitions(rawValue:definition) {
              switch definitionEnum {
              case .Abstraction:
                destinationViewController.definitionMsg = "definition 1"
              case .BinarySystem:
                destinationViewController.definitionMsg = "definition 2"
              case .Computer:
                destinationViewController.definitionMsg = "definition 3"
              case .Internet:
                destinationViewController.definitionMsg = "definition 4"
              case .VirtualReality:
                destinationViewController.definitionMsg = "definition 5"
              }
              destinationViewController.titleMsg = definition
            }
          }
        }
      }
      

      【讨论】:

        【解决方案3】:

        使用此代码

           override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            if (segue.identifier == "ShowDefinition") {
                if let destinationViewController = segue.destinationViewController as? EnglishViewController {
                    if let definition = sender as? String {
                        switch definition {
                        case "Abstraction":
                            destinationViewController.titleMsg = "Abstraction"
                            destinationViewController.definitionMsg = "definition 1"
                        case "Binary System":
                            destinationViewController.titleMsg = "Binary System"
                            destinationViewController.definitionMsg = "definition 2"
                        case "Computer":
                            destinationViewController.titleMsg = "Computer"
                            destinationViewController.definitionMsg = "definition 3"
                        case "Internet":
                            destinationViewController.titleMsg = "Internet"
                            destinationViewController.definitionMsg = "definition 4"
                        case "Virtual Reality":
                            destinationViewController.titleMsg = "Virtual Reality"
                            destinationViewController.definitionMsg = "definition 5"
                        default:
                            // As per your requirement
                            break
                        }
                    }
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          在这个特定的用例中,您不必真正求助于串行 if-elseswitch 块,因为测试仅涉及测试给定的 String 实例 (definition) 是否等于String 的给定列表的任何成员。

          因为destinationViewController.titleMsg 被赋予与definition 相同的值(在匹配的情况下),而destinationViewController.definitionMsg 只是一个运行数字w.r.t。 String 列表的索引 (+1),您可以在单个可选绑定子句中捕获所有逻辑:

          let validTitles = ["Abstraction", "Binary System", "Computer", "Internet", "Virtual Reality"]
          let definition = "Abstraction"
          
          if let definitionAndTitle = validTitles.enumerated().filter({$1 == definition}).first {
              print("titleMsg=\(definitionAndTitle.1)")
              print("definitionMsg=\(definitionAndTitle.0 + 1)")
          }
          

          应用于您的示例(只需扩展您现有的可选绑定条款)

          override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
              if (segue.identifier == "ShowDefinition") {
                  if let destinationViewController = segue.destinationViewController as? EnglishViewController {
                      // or, better, keep this list of titles as e.g. a static
                      // immutable property of your viewcontroller class, as these
                      // should already be set at compile time.
                      let validTitles = ["Abstraction", "Binary System",
                                         "Computer", "Internet", "Virtual Reality"]
                      if let definition = sender as? String, let defNum = 
                          validTitles.enumerated().filter({$1 == definition}).first?.0 {
                          destinationViewController.titleMsg = definition
                          destinationViewController.definitionMsg = "definition \(defNum+1)"
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-09
            • 1970-01-01
            • 2014-04-13
            • 2010-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多