swift - 用部分确定枚举大小写

标签 swift uitableview

我正在实现一个包含多个部分的 UITableView。部分的数量是动态的。这是一些属性:

public struct User { 
    let userRole: UserRole
}

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

我的 UITableView 包含一个 users 数组。部分的数量是 users 数组中不同的 userRoles 的数量。稍后,我需要使用此函数确定每个部分中有多少行:

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

我想知道返回该部分中行数的最干净/最快的方法是什么。假设 user 数组包含 2 个 users,其中一个具有 superUseruserRole,另一个 recruiter。这些部分是 0 和 1,尽管枚举原始值是 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()
    }
}

最佳答案

按照拥有模型的建议,您可以执行以下操作:

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
    }   
}

关于swift - 用部分确定枚举大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250914/

相关文章:

ios - Swift 将十进制字符串转换为 UInt8-Array

ios - Xcode Storyboard 上的并排约束

ios - 将数据从 Collection View 单元格内的 TableView 单元格传输到另一个 Collection View 单元格[带图片!]

iphone - 使用 NSXMLParser 解析 XML 的最有效方法

objective-c - UITableView didSelectRowAtIndexPath 方法未触发

ios - TableView 的渐变

ios - 应用程序在调用电话时出错

swift - NSManagedObject 子类模拟

ios - 如何在 cellForRowAtIndexPath 方法中判断滚动方向(右上左下)

ios - dequeueReusableCellWithIdentifier UITableView 两次