Почему @unknown default (Swift 5) вызывает ошибку компиляции?

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

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

Почему @unknown default (Swift 5) вызывает ошибку компиляции?

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

Почему @unknown default (Swift 5) вызывает ошибку компиляции?

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

Почему @unknown default (Swift 5) вызывает ошибку компиляции?

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

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

Ashish Kakkad 09.04.2019 11:50

Только для того, чтобы читатели могли видеть сообщения об ошибках в контексте.

Ron 09.04.2019 15:01

Это известная ошибка СР-9920.

Hamish 09.04.2019 16:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
924
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

@unknown may only be applied to default or a case consisting of the single pattern _. Even in the latter case, @unknown must be used with the last case in a switch. This restriction is discussed further in the "unknown patterns" section under "Future directions".

Чем средний пример не последний случай?

Ron 09.04.2019 15:00

Пробовали ли вы в своем среднем примере поставить ; в конце return, например: return;?

denis_lor 09.04.2019 15:25

Поздно вечером, не подумал об этом. Спасибо, только что попробовал, работает. Все еще думаю, что это ошибка Xcode, поскольку Swift делает большое дело об отсутствии точек с запятой.

Ron 09.04.2019 15:46

Да, я думаю, это ошибка xcode с новыми изменениями Swift 5. Я добавил это как утверждение в ответ, чтобы убедиться, что оно правильно адресовано будущим читателям :)

denis_lor 09.04.2019 18:10

«Все еще думаю, что это ошибка Xcode, поскольку Swift делает большое дело об отсутствии точек с запятой». Это неправда. Есть много других ситуаций, когда вам нужна точка с запятой после return, чтобы компилятор не подумал, что вы пытаетесь вернуть следующую строку.

matt 09.04.2019 18:18

Есть много ситуаций, когда голый 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 является практически рефлекторным действием, хотя в наши дни в этом обычно больше нет необходимости.

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

Есть ли документация по этому поводу? Потому что это похоже на ошибку xcode

denis_lor 09.04.2019 18:36

Пример, который вы приводите, немного отличается — это return, за которым следует выражение, что является допустимым. Случай OP - это return, за которым следует оператор, который Swift должен иметь возможность обрабатывать как голый возврат, за которым следует оператор (вместо того, чтобы пытаться анализировать оператор как выражение). Это ошибка (СР-9920), что уже исправлено :)

Hamish 09.04.2019 18:40

@Hamish Я изменил пример на более убедительный.

matt 09.04.2019 18:51

@matt Это все еще выражение после возврата - рассмотрите другие случаи, когда оператор следует за возвратом, например, gist.github.com/hamishknight/b3014d64a8a9f820e29076ce0a21137‌​0, компилятор обрабатывает их правильно.

Hamish 09.04.2019 19:08

@Hamish Моя единственная цель - убедить ОП, что нет ничего необычного в том, чтобы писать return;, и что некоторые из нас просто делают это все время.

matt 09.04.2019 19:12

@matt Достаточно честно - я просто хотел указать, что в случае с OP не должно быть двусмысленности при синтаксическом анализе, он должен компилироваться без ошибок или предупреждений.

Hamish 09.04.2019 20:49

@Hamish Я думаю, что они должны компилировать все без ошибок или предупреждений.

matt 09.04.2019 22:10

Другие вопросы по теме