Преобразование структуры if else в регистр переключения в swift

#ios #swift #if-statement #switch-statement

#iOS #swift #if-оператор #switch-оператор

Вопрос:

Я довольно новичок в программировании, я пытаюсь преобразовать эту структуру if else в регистры переключения на языке Swift, я ценю вашу помощь, спасибо.

вот мой код

 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"

                }
            }
        }
    }
}
  

Ответ №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:

В этом конкретном случае использования вам не нужно прибегать к serial if-else или switch block, поскольку тест относится только к проверке того, равен ли данный String экземпляр ( definition ) любому члену заданного списка String .

Поскольку destinationViewController.titleMsg просто присваивается то же значение, definition что и (в случае совпадения), и destinationViewController.definitionMsg является просто текущим числом с индексом ( 1 ) списка String ‘s, вы можете зафиксировать всю эту логику в одном необязательном предложении привязки:

 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)"
            }
        }
    }
}