Как вы можете сделать простой встроенный тест для случая перечисления, со связанными значениями, которые вас не интересуют?

Учитывая этот код:

class Item{}

func foo(item:Item){}

enum SelectionType{
    case single(resultsHandler:(Item)->Void)
    case multi(resultsHandler:([Item])->Void)
}

var selectionType:SelectionType = .single(resultsHandler:foo)

// This line won't compile
let title = (selectionType == .single)
    ? "Choose an item"
    : "Choose items"

Как вы можете обновить часть, которая не будет компилироваться?

2 ответа

Решение

Тернарный оператор не может работать для перечислений со связанными значениями, потому что классический оператор равенства не работает с ними. Вы должны использовать сопоставление с образцом, или if case синтаксис:

let title: String
if case .single = selectionType {
    title = "Choose an item"
} else {
    title = "Choose items"
}

Я не знаю, есть ли прямой способ обратиться к тому, что вы ищете.

Мое понимание:

  • Перечисления не равны по умолчанию, вы должны реализовать Equatable
  • Для перечислений со связанными значениями, даже если вы реализовали это, я не думаю, что возможно достичь того, что вы просили.

Вычисляемая переменная (обходной путь 1):

enum SelectionType{

    case single(resultsHandler:(Item)->Void)
    case multi(resultsHandler:([Item])->Void)

    var title : String {

        let text : String

        switch self {

        case .single(_):
            text = "Choose an item"
        case .multi(_):
            text = "Choose items"
        }

        return text
    }
}

var title = selectionType.title

Случай использования (Обходной путь 2):

if case .single(_) = selectionType {
    print("Choose an item")
}
else {
    print("Choose items")
}
Другие вопросы по тегам