2016-05-26 3 views
2

Я создаю перечисление, содержащее все месяцы года. Вычисленное значение перечисления возвращает университетские семестры на основе входного месяцаПосле компиляции не появилось предупреждение, почему оно меня предупреждает?

enum Month{ 
    case January, February, March, April, May, June, July, August, September, October, November, December 


var schoolSemester: String { 
      switch self { 
     case .April, .September, .October, .November, .December: 
      return "Autumn" 
     case .January, .February, .March, .April, .May: 
      return "Sping" // Here comes the warning 
     default: 
      return "Not in the school year" 
     } 
    } 
} 

var whichSemester = Month.February 
print(whichSemester.schoolSemester)//even though the warning says this will never be executed, but it was executed! 

Question1: Почему Xcode продолжает говорить мне, что второй случай никогда не будет выполнен (что неправильно я исполнить дело по назначить февраля в месяц) enter image description here

Вопрос 2: вычисляется свойству ленивый недвижимость?

Большое спасибо за ваше время и помочь

+3

Вы указали случай '.April' * дважды * ... –

+1

Ложное свойство - это не то же самое, что вычисленное свойство. Вычисленное свойство оценивается каждый раз, когда вы обращаетесь к нему - ленивое свойство оценивается только при первом доступе к нему, а затем сохраняется. – Hamish

+0

@ originaluser2 Как насчет второго раза доступа к ленивому имуществу? будет ли оно обновляться и храниться снова? – SLN

ответ

1

Компилятор выдает предупреждение, потому что вы, по-видимому неправильно набранный .August, как .April в первом случае, так что .April происходит в обоих случаях.

Компилятор не заметил, что вы опустили .August, потому что вы использовали случай по умолчанию. Поэтому лучше, чтобы перечислить все возможные значения перечисления явно вместо:

var schoolSemester: String { 
    switch self { 
    case .April, .September, .October, .November, .December: 
     return "Autumn" 
    case .January, .February, .March, .April, .May: 
     return "Spring" 
    case .June, .July: 
     return "Not in the school year" 
    } 

Теперь вопросы компилятор одновременно предупреждения и ошибки

 
warning: case will never be executed 
     case .January, .February, .March, .April, .May: 
error: switch must be exhaustive, consider adding a default clause 

и делает код не компилировать. Заставляет вас снова проверить все случаи , и вы быстро заметите, что отсутствует .August.

+0

Спасибо за код и подробную интерпретацию. Хорошее объяснение и расширение – SLN

3

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

+0

Прохладный! он работает после .April удаляется из первого случая. Спасибо человеку :) – SLN

0

.April указан для двух разных случаев, поэтому инструкция никогда не выполнит второй случай, содержащий апрель. Просто удалите апрель из одного из корпусов, и он сработает!

+0

Да! после удаления a.April из одного из списка, больше нет предупреждений – SLN

Смежные вопросы