2015-07-22 2 views
0

Назад в старые дни Objective-C Я часто использовал перечисления для таких вещей, как таблицы с постоянным содержимым, сегментированные элементы управления и т. Д. - в ситуациях, когда появился принудительный инкрементированный список целых чисел, начинающийся с нуля. Я также часто добавляю ... счетчик в конец, чтобы подсчитать количество записей, полезных для строк таблицы &. Попытка сделать это с помощью быстрых перечислений доказывает сложность - много конверсий до & из необработанных значений и дополнительных опций по умолчанию в переключателях, чтобы разрешить запись «count». Может ли кто-нибудь предложить грациозный метод борьбы с подобными ситуациями?Быстрая замена для старых списков стиля

+0

если вы хотите, чтобы считать свои записи, не добавлять этот элемент, попробуйте это [Как получить счетчик быстротекущего перечисления?] (HTTP : //stackoverflow.com/questions/27094878/how-do-i-get-the-count-of-a-swift-enum) –

ответ

0

Добавить функцию «count» для каждого перечисления. Например,

static func count() -> Int { return 3 } 

Целое число -> преобразование enum выполняется методом init.

2

Автоматический прирост по-прежнему доступен в 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 

И так далее .. :)

+0

Жесткое кодирование счетчика - либо как литерал, либо путем ссылки на (названный) последним элемент - это проблемы обслуживания, ожидающие своего завершения, и все это ... член счета должен был автоматизировать этот процесс. Лучшее решение, похоже, состоит в том, чтобы добавить вычисляемое значение «count», которое повторяется с помощью целых чисел от нуля до тех пор, пока не найдет тот, который не является допустимым исходным значением. Это неудобно, но полезно. –

+0

Вам не нужно вызывать вычисляемое значение 'count'. для exmaple: 'static let count: Int = {var i = 0; while Section (rawValue: i)! = nil {i ++}; return i}() 'работает. – rintaro

Смежные вопросы