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