Почему @unknown default (Swift 5) вызывает ошибку компиляции? - PullRequest
2 голосов
/ 09 апреля 2019

Мне кажется, я понимаю логику, стоящую за @unknown default, и я извиняюсь за скриншоты вместо кода, но это единственный способ увидеть сообщения об ошибках в контексте.

Преобразование проекта в Swift 5. Этозапускается, но получает это предупреждение, которое я понимаю:

enter image description here

Так что я позволил Xcode исправить это для меня, и получил это:

enter image description here

Я изменил порядок заготовок заглушек (это работа в процессе), что делает компилятор снова счастливым:

enter image description here

Я делаю то, что не должен, или это странное поведение компилятора?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Ошибка на среднем изображении выглядит как ошибка в swift , и ее можно устранить, добавив точку с запятой в конце оператора возврата.

В общем случае компилятор ожидает, что @unknown default будет последним случаем. Проверьте @ неизвестную документацию от apple , где объясняется, почему она должна использоваться с последним регистром в коммутаторе, и больше по ссылке «неизвестные шаблоны» в следующей цитате:

@ unknown может применяться только по умолчанию или в случае, состоящем из один образец _. Даже в последнем случае @ unknown должен использоваться с последний случай в переключателе . Это ограничение обсуждается далее в «неизвестные образцы» раздел «Будущие направления».

0 голосов
/ 09 апреля 2019

Есть много ситуаций, когда пустой return, за которым следует другая строка кода, заставляет Swift думать, что вы пытаетесь вернуть эту строку кода. Ситуация менее запутанная, чем раньше, потому что теперь есть по крайней мере предупреждение, чтобы рассказать вам об этом (и ситуация возникает в гораздо меньшем диапазоне случаев, чем раньше):

@IBAction func doDismiss(_ sender: Any) {
    return
    self.presentingViewController?.dismiss(animated:true)
}

Этот код выглядит допустимым, но он не компилируется, в результате получается странная на первый взгляд ошибка компиляции:

Value of optional type 'Void?' must be unwrapped to a value of type ‘Void'

К счастью, в этом случае причину странности теперь также раскрывает предупреждение (обычно):

Expression following 'return' is treated as an argument of the 'return'

Решением всегда было добавление точки с запятой после return. Действительно, для тех из нас, кто использовал Swift начиная со Swift 1, добавление точки с запятой после голого return является практически рефлекторным действием, даже если в наши дни оно больше не требуется.

Ваша ситуация в основном относится к той же проблеме. Проблема в том, что вы не получите пояснительное предупреждение.

...