Новый Swift 5 предупреждений для перечислений Objective-C: как от них избавиться? - PullRequest
7 голосов
/ 28 марта 2019

Начиная с Xcode 10.2, при использовании перечислений, которые я определил в Objective-C, но в операторе-переключателе Swift 5 я получаю следующее предупреждение, даже если я исчерпал все возможные значения перечисления.

Switch covers known cases, but 'MyObjectiveCEnumName' may have additional 
unknown values

Xcode говорит мне, что я должен это исправить

Handle unknown values using "@unknown default"

Почему это происходит и что я могу с этим поделать?


Пример

Objective-C enum

typedef NS_ENUM(NSUInteger, CardColor) {
  CardColorBlack,
  CardColorRed
};

оператор Swift 5

var cardColor: CardColor = .black

switch (cardColor) {
case .black:
  print("black")
case .red:
  print("red")
}

1 Ответ

10 голосов
/ 28 марта 2019

TL; DR

Если вы хотите, чтобы перечисления Objective-C обрабатывались точно так же, как и Swift, теперь вам нужно объявить их с использованием другого макроса, NS_CLOSED_ENUM, вместо старого NS_ENUM.Изменение этого параметра приведет к исчезновению предупреждения.

Deets

Из примечаний к выпуску Swift 5 :

В режиме Swift 5 переключаетсяперечисления, которые объявлены в Objective-C или поступают из системных платформ, необходимы для обработки неизвестных случаев - случаев, которые могут быть добавлены в будущем или которые могут быть определены в частном порядке в файле реализации Objective-C.Формально Objective-C позволяет хранить любое значение в перечислении, если оно соответствует базовому типу.Эти неизвестные случаи могут быть обработаны с использованием нового случая @unknown по умолчанию, который по-прежнему выдает предупреждения, если какие-либо известные случаи не включены в коммутатор.Они также могут обрабатываться с использованием обычного регистра по умолчанию.

Если вы определили собственное перечисление в Objective-C и вам не нужны клиенты для обработки неизвестных случаев, вы можете использовать макрос NS_CLOSED_ENUM вместо NS_ENUM,Компилятор Swift распознает это и не требует, чтобы переключатели имели регистр по умолчанию.

...