Определить enum case с разделом - PullRequest
0 голосов
/ 11 ноября 2018

Я реализую UITableView, который будет иметь несколько разделов. Количество разделов является динамическим. Вот некоторые свойства:

public struct User { 
    let userRole: UserRole
}

public enum UserRole: Int, CaseIterable { 
    case superUser, admin, recruiter
}

My UITableView содержит массив users. Количество разделов - это количество различных userRoles в массиве users. Позже мне нужно определить количество строк в каждом разделе с помощью этой функции:

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {}

Мне интересно, какой самый простой / быстрый способ вернуть количество строк в этом разделе. Представьте, что массив user содержит 2 users, один имеет userRole superUser, а другой recruiter. Разделы - 0 и 1, хотя необработанные значения enum - 0 и 2.

Я понятия не имею, как правильно вернуть правильное количество строк в этом разделе. Это то, о чем я писал, но остановился, потому что, хотя я должен был найти лучший способ:

extension Array where Element: User {
    func contains(userRole: UserRole) -> Bool {
        return contains(where: { $0.userRole == userRole })
    }
}

private func determineUserRoleForSection(section: Int) -> UserRole {
    let containsSuperUser = users.contains(userRole: .superUser)
    let containsAdmin = users.contains(userRole: .admin)
    let containsRecruiter = users.contains(userRole: .recruiter)

    switch section {
    case 0:
        if containsSuperUser {
            return .superUser
        }

        if containsAdmin {
            return .admin
        }

        if containsRecruiter {
            return .recruiter
        }
    case 1:
        // Repeat without superUser case
    case 2:
    default: fatalError()
    }
}

1 Ответ

0 голосов
/ 11 ноября 2018

Следуя рекомендации иметь модель, вы можете сделать что-то вроде этого:

public struct UsersViewModel {
    var users: [User]
    private var sections: [UserRole: [User]] {
        return [
            .admin : users.filter { $0.userRole == .admin },
            .superUser : users.filter { $0.userRole == .superUser },
            .recruiter : users.filter { $0.userRole == .recruiter }
        ]
    }
    var superUserSections: Int { return sections[.superUser]!.count}
    var adminSections: Int { return sections[.admin]!.count }
    var recruiterSections: Int { return sections[.recruiter]!.count }
}

И тогда это будет просто вопрос использования:

public func tableView(_ tableView: UITableView, numberOfSections section: Int) -> Int {
    return 3 // section 0 is superUser, section 1 is admin, section 2 is recruiter.
}

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return viewModel.superUserSections
    case 1:
        return viewModel.adminSections
    case 2:
        return viewModel.recruiterSections
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...