Skip to content

Instantly share code, notes, and snippets.

@ukitaka
Last active February 22, 2017 02:10
Show Gist options
  • Save ukitaka/0cf33c15b67067dacb4ee8c9904ce31a to your computer and use it in GitHub Desktop.
Save ukitaka/0cf33c15b67067dacb4ee8c9904ce31a to your computer and use it in GitHub Desktop.
パターンマッチで網羅性を判断できない時がある @ Swift 3.0.2
let a = true
let b = false
let c = true
// MARK: - 2個のパターン
// OK
switch (a, b) {
case (true, _):
break
case (false, _):
break
}
// OK
switch (a, b) {
case (_, true):
break
case (_, false):
break
}
// OK
switch (a, b) {
case (true, true):
break
case (false, true):
break
case (_, false):
break
}
// OK
switch (a, b) {
case (_, true):
break
case (true, false):
break
case (false, false):
break
}
// OK
switch (a, b) {
case (true, _):
break
case (false, true):
break
case (false, false):
break
}
// NG: needs default case
switch (a, b) {
case (true, true):
break
case (true, false):
break
case (false, _):
break
default:
break
}
// OK
switch (a, b) {
case (_, _):
break
}
// MARK: - 3個のパターン
// OK
switch (a, b, c) {
case (true, true, _):
break
case (true, false, _):
break
case (false, true, _):
break
case (false, false, _):
break
}
// NG: needs default case
switch (a, b, c) {
case (true, true, true):
break
case (true, true, false):
break
case (true, false, _):
break
case (false, true, _):
break
case (false, false, _):
break
default:
break
}
// NG: needs default case
switch (a, b, c) {
case (true, true, _):
break
case (true, false, true):
break
case (true, false, false):
break
case (false, true, _):
break
case (false, false, _):
break
default:
break
}
@ukitaka
Copy link
Author

ukitaka commented Feb 22, 2017

ワイルドカード(_) を、具体的に書いたcaseの後に使うとダメっぽい。

並び替えればOK

// NG: needs default case
switch (a, b) {
case (true, true): break
case (true, false): break
case (false, _): break
default: break
}

// OK
switch (a, b) {
case (false, _): break
case (true, true): break
case (true, false): break
}

ただし最後の値以外の場合はただしく動くっぽい...

// OK
switch (a, b) {
case (_, false): break
case (true, true): break
case (false, true): break
}

// OK こっちも
switch (a, b) {
case (true, true): break
case (false, true): break
case (_, false): break
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment