Swift переключает регистр для использования содержимого массива, синтаксиса?

#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