Как вы можете сделать простой встроенный тест для случая перечисления, со связанными значениями, которые вас не интересуют?
Учитывая этот код:
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")
}