编译后没有出现警告,为什么会警告我?

A warning didn't appears after compiled, why it warns me?

我创建了一个包含一年中所有月份的枚举。枚举的计算值returns大学学期基于输入的月份

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!

问题1:为什么Xcode一直告诉我第二种情况永远不会执行(这是错误的!我确实通过将二月分配给月)

问题2:计算属性一个Lazy属性?

非常感谢您的宝贵时间和帮助

问题是因为您在第一种情况和第二种情况下都有 .April。这就是第二种情况永远不会被执行的原因。

.April 列出了两种不同的情况,因此语句永远不会执行包含 April 的第二种情况。只需将 April 从其中一个案例中删除即可!

编译器发出警告,因为您显然输入错误 .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 不见了。