Назад в старые дни Objective-C Я часто использовал перечисления для таких вещей, как таблицы с постоянным содержимым, сегментированные элементы управления и т. Д. - в ситуациях, когда появился принудительный инкрементированный список целых чисел, начинающийся с нуля. Я также часто добавляю ... счетчик в конец, чтобы подсчитать количество записей, полезных для строк таблицы &. Попытка сделать это с помощью быстрых перечислений доказывает сложность - много конверсий до & из необработанных значений и дополнительных опций по умолчанию в переключателях, чтобы разрешить запись «count». Может ли кто-нибудь предложить грациозный метод борьбы с подобными ситуациями?Быстрая замена для старых списков стиля
ответ
Добавить функцию «count» для каждого перечисления. Например,
static func count() -> Int { return 3 }
Целое число -> преобразование enum выполняется методом init.
Автоматический прирост по-прежнему доступен в Swift.
enum Section: Int {
case A = 0
case B
case C
}
Section.C.rawValue // -> 2
Что касается count
, вы должны реализовать ее вручную (как How do I get the count of a Swift enum?):
enum Section: Int {
case A = 0
case B
case C
static let count = C.rawValue + 1
}
Как для «преобразования в & от исходных значений и дополнительных пунктов по умолчанию» проблемы, сравните с enum
вместо его rawValue
.
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return Section.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch Section(rawValue: section)! {
case .A: return 1
case .B: return 2
case .C: return 5
}
}
Если вы хотите сделать что-то вроде array[Section.A]
, вы можете легко реализовать.
extension Array {
subscript(section: Section) -> T {
return self[section.rawValue]
}
}
extension NSIndexPath {
convenience init(forRow row: Int, inSection section: Section) {
self.init(forRow: row, inSection: section.rawValue)
}
}
let array = ["foo", "bar", "baz"]
array[.B] // -> "bar"
let indexPath = NSIndexPath(forRow: 20, inSection: .C)
indexPath.section // -> 2
indexPath.row // -> 20
И так далее .. :)
Жесткое кодирование счетчика - либо как литерал, либо путем ссылки на (названный) последним элемент - это проблемы обслуживания, ожидающие своего завершения, и все это ... член счета должен был автоматизировать этот процесс. Лучшее решение, похоже, состоит в том, чтобы добавить вычисляемое значение «count», которое повторяется с помощью целых чисел от нуля до тех пор, пока не найдет тот, который не является допустимым исходным значением. Это неудобно, но полезно. –
Вам не нужно вызывать вычисляемое значение 'count'. для exmaple: 'static let count: Int = {var i = 0; while Section (rawValue: i)! = nil {i ++}; return i}() 'работает. – rintaro
- 1. Более быстрая замена для Regex
- 2. Быстрая автозаполнения для выпадающих списков
- 3. Быстрая замена JComboBox/BasicComboBoxUI?
- 4. Быстрая замена строки Javascript
- 5. Быстрая замена нескольких строк
- 6. Быстрая, Atomic Таблица Замена
- 7. Быстрая замена значений numpy
- 8. Быстрая замена макроса Objective-C
- 9. Замена старых значений при рисовании
- 10. Быстрая сортировка больших вложенных списков
- 11. Быстрая замена значений узлов XML
- 12. Замена для структуры стиля C в ООП
- 13. Внешнее соединение SQL-стиля для двух списков
- 14. Быстрая альтернатива Python для списков для простых чисел?
- 15. Быстрая замена tzinfo на pandas.Series of datetime
- 16. Быстрая замена словаря <TKey, TValue>
- 17. Быстрая замена таблицы в T-SQL еще
- 18. Быстрая замена выбранных записей матрицы в R
- 19. Быстрая замена значений в Numpy массиве
- 20. Быстрая замена значений в массиве numpy
- 21. Быстрая замена переменных окружения окон оболочки
- 22. Замена старых данных столбца на новое слева
- 23. замена старых цифр на newone после инкремента
- 24. Замена старых классов и методов библиотеки ACT
- 25. Самая быстрая замена символов в строке
- 26. Замена пустых списков со значением
- 27. Любая умная/быстрая/более полная замена для этой строки кода?
- 28. Что такое быстрая замена по модулю для генерации случайных чисел?
- 29. Замена __str__ в классе нового стиля
- 30. Замена MSpec для модульного теста стиля BDD в приложении winrt
если вы хотите, чтобы считать свои записи, не добавлять этот элемент, попробуйте это [Как получить счетчик быстротекущего перечисления?] (HTTP : //stackoverflow.com/questions/27094878/how-do-i-get-the-count-of-a-swift-enum) –