2016-04-21 35 views
4

我认为以下swift代码覆盖了所有可能性,但Xcode一直告诉我,“Switch必须是详尽的,考虑添加默认子句。”swift中的开关错误? - “交换机必须是详尽的,考虑添加默认条款。”

谁能告诉我我错过了什么?谢谢。

let a = false 
let b = false 
let c = false 

func test(a: Bool, _ b: Bool, _ c: Bool) { 
    switch (a, b, c) { 
    case (true, false, _): 
     print("Moved left!!!") 
    case (true, true, _): 
     print("Moved right!!!") 
    case (false, _, false): 
     print("Moved up!!!") 
    case (false, _, true): 
     print("Moved down!!!") 
    // Error: Switch must be exhaustive, consider adding a default clause. 
    } 
} 

test(false, false, false) 
test(false, false, true) 
test(false, true, false) 
test(false, true, true) 
test(true, false, false) 
test(true, false, true) 
test(true, true, false) 
test(true, true, true) 

回答

0

在Swift中,switch声明必须始终为所有可能的情况提供一个选项。如果你有一个枚举,你可以添加所有的枚举值,并且switch将是详尽的。如果不详尽,则需要添加一个default的情况,这会在没有其他情况匹配时触发。

如果您打开一个变量,您应该用尽所有情况。如果你这样做,则不需要default的情况。

程序员可能能够看到这个开关是详尽的,但编译器没有。这就是为什么你会得到这个错误,你可以通过添加一个默认情况来解决它。

0

如果您计算三个元素之间具有两个可能值的所有可能组合,则情况超过四个。如果您不关心其他人,请在您的交换机上放一个default外壳

+0

'_' _(通配符模式)_涵盖了“失踪案例”。问题中的每个case都包含两种可能性:'_'可以是任何值,因此在这里可以是'true'或'false' - 总共涵盖所有8 _(2 3)_个可能性。 –

1

编译器无法对您的模式做出总结,因为它太复杂或太不寻常。如果你的模式会更加规则,例如:

case (true, false, _): 
    print("Moved left!!!") 
case (true, true, _): 
    print("Moved right!!!") 
case (false, false, _): 
    print("Moved up!!!") 
case (false, true, _): 
    print("Moved down!!!") 

然后编译器就不会抱怨了。这种情况下,它很容易得出结论,你涵盖了所有的情况。

相关问题