#arrays #swift #syntax #switch-statement
#массивы #swift #синтаксис #switch-оператор
Вопрос:
В книге Swift от Apple есть пример switch, в котором в качестве регистра используются гласные.
Вопрос.Можно ли вместо этого списка гласных использовать массив, содержащий это содержимое? если да, то каков синтаксис для этого?
~ из книги Apple Swift ~
В следующем примере удаляются все гласные и пробелы из строчной строки, чтобы создать загадочную фразу-головоломку:
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
switch character {
case "a", "e", "i", "o", "u", " ":
continue
default:
puzzleOutput.append(character)
}
}
print(puzzleOutput)
// Prints "grtmndsthnklk"
Ответ №1:
ДА:
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let vowels: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput.characters {
switch character {
case _ where vowels.contains(character):
continue
default:
puzzleOutput.append(character)
}
}
case
сопоставление в Swift зависит от оператора сопоставления с образцом ( ~=
). Если вы определите для него новую перегрузку, вы можете сократить код еще больше:
func ~=<T: Equatable>(pattern: [T], value: T) -> Bool {
return pattern.contains(value)
}
for character in puzzleInput.characters {
switch character {
case vowels:
continue
default:
puzzleOutput.append(character)
}
}
Комментарии:
1. Выше и выше! Спасибо! Это очень элегантно и мощно. Пожалуйста, извините за мое невежество, что означает / делает оператор сопоставления с образцом (` ~= `)?
2. @Confused Он принимает шаблон (в данном случае массив некоторого типа
T
[T]
) и значение (в данном случае некоторого типаT
) и возвращает true, если шаблон соответствует этому значению. Что означает «совпадения», зависит от вас и определяется телом функции3. Другой распространенный пример, который вы увидите
~=
, используется для проверки диапазонов. Например,0...10 ~= 5
возвращает true, потому что шаблон0...10
соответствует значению5
в соответствии с определением «совпадений», определенным реализацией оператора. Поскольку этот оператор существует, вы можете указатьcase 0...5
его непосредственно в операторе switch.4. Значит, это похоже на сочетание «имеет» и «является»? @AlexanderMomchliov
5. @Confused Его точное значение может быть любым, каким оно должно быть. Вот интересный пример, который я только что придумал: swiftlang.ng.bluemix.net/#/repl/58008106db09af01efbe6699