Swift не может определить, что предложения switch являются исчерпывающими

#swift

#swift

Вопрос:

Это искусственная проблема, потому что я хочу узнать о swift более подробно. Компилятор swift жалуется на то, что следующее не является исчерпывающим. Конечно, в общем случае он не может определить, являются ли операторы case исчерпывающими. Как лучше всего сообщить компилятору, что мой список является исчерпывающим, например, в следующем случае?

 let point = (2, 2) 

switch point {    
    case let (x, y) where x == y:
        println("on the x=y line")
    case let (x, y) where x != y:
        println("somewhere else off x=y line") 
}
  

Это единственный вариант добавить пустые значения по умолчанию: cases?

Ответ №1:

Это единственный вариант добавить пустые значения по умолчанию: cases?

На данный момент, да. Это ошибка компилятора, которую мы, на данный момент, должны обойти. На вашем месте я бы, конечно, отправил радар с подробным описанием ваших находок.

Комментарии:

1. Возможно, в конечном итоге это не будет «ошибкой компилятора», которая когда-либо будет исправлена. При перегрузке оператора возможно создавать типы, в которых ни == ни != не будут возвращать true для одних и тех же двух операндов.

2. Я зарегистрировал радар, как было предложено; см. 17568787.

3. Apple сообщила об ошибке 17568787. Он закрыт, потому что для его разрешения потребовался бы решатель ограничений, но это отрицательно повлияло бы на время компиляции.

Ответ №2:

Я изучаю Swift и нашел следующее решение для вашего краткого фрагмента:

 let point = (2, 2)

switch point {
case let (x, y) where x == y:
    print("on the x=y line")
case let (x, y): // Otherwise where x != y:
    print("somewhere else off x=y line")
}
  

Я знаю, это не решение для проверки исчерпываемости, выполняемой компилятором, но это способ избежать бесполезного default предложения.