if ([.A, .B, .C, .D] as? [Types]).map { tableViewDataSource.firstIndex(of: $0) }
.contains(textField.tag)
Что я здесь не так делаю?
Есть две проблемы.
Сначала вы использовали as?
вместо as
.Когда вы используете условное приведение as?
, результат будет [Types]?
: необязательный [Types]
.Затем Swift использует опциональную версию map
, и вы в основном движетесь в неверном направлении.
Вам нужно было использовать as [Types]
, потому что вы просто приказываете Swift интерпретировать [.A, .B, .C, .D]
as [Types]
.
Вторая проблема заключается в том, что, поскольку вы делаете это в одной строке, вам нужно несколько дополнительных скобок (
, )
вокруг замыкания для map
, потому что Swiftне любит множественные {
после if
.Без уточняющих паренов он будет интерпретировать первый {
, который принадлежит замыканию для map
, как начало , а затем блока для if
.
Итак:
if ([.A, .B, .C, .D] as [Types]).map({ tableViewDataSource.firstIndex(of: $0) }).contains(textField.tag) {
// do something
}
будет работать.
Вы также можете просто явно ввести одну из записей массива, и Swift интерпретирует весь массив как [Types]
следующим образом:
if [Types.A, .B, .C, .D].map({ tableViewDataSource.firstIndex(of: $0) }).contains(textField.tag) {
// do something
}
Примечание:
Обычное соглашение Swift - начинать имена типов class
, struct
и enum
с заглавными буквами и для запуска переменных, методов и значений перечисления с строчными буквами.
Таким образом, ваш enum
может быть записан как:
enum Types {
case a, b, c, d
}