代码之家  ›  专栏  ›  技术社区  ›  J. Doe

使用节确定枚举大小写

  •  1
  • J. Doe  · 技术社区  · 6 年前

    我正在实施一个 UITableView 它将有多个部分。节的数量是动态的。以下是一些属性:

    public struct User { 
        let userRole: UserRole
    }
    
    public enum UserRole: Int, CaseIterable { 
        case superUser, admin, recruiter
    }
    

    UITableView 包含一个数组 users . 节的数量是不同节的数量 userRoles 用户

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

    我想知道最干净/最快的方法是返回该节中的行数。想象一下 user 阵法容纳2人 用户 ,一个有一个 userRole 属于 superUser 另一个呢 recruiter

    我不知道如何以干净的方式返回该节中正确的行数。这是我正在写的,但我停了下来,因为我想一定有更好的方法:

    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 回复  |  直到 6 年前
        1
  •  1
  •   regina_fallangi BigFab    6 年前

    按照建立模型的建议,您可以这样做:

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