如何解决气旋复杂性? - RxDataSource RxSwift - SwiftLint

Posted

技术标签:

【中文标题】如何解决气旋复杂性? - RxDataSource RxSwift - SwiftLint【英文标题】:How to fix Cyclonemtic Complexity? - RxDataSource RxSwift - SwiftLint 【发布时间】:2022-01-13 13:23:49 【问题描述】:

当我使用 RxDataSource 时,我遇到了这样的警告“违反循环复杂度:函数的复杂度应为 10 或更低:当前复杂度等于 14 (cyclomatic_complexity)”。

我的代码结构是这样的:

struct ItemDetailDataSource 
    typealias DataSource = RxTableViewSectionedReloadDataSource
    
    static func dataSource() -> DataSource<ItemDetailTableViewSection> 
        return .init(configureCell:  (dataSource, tableView, indexPath, _) -> UITableViewCell in
            
            switch dataSource[indexPath] 
            case .itemInfoTopItem(let info):
                guard let cell = tableView.dequeueReusableCell(withIdentifier: ConstantsForCell.infoTopTableViewCell,
                                                               for: indexPath)
                    as? InfoTopTableViewCell else 
                        return UITableViewCell()
                
                cell.configure(info)
                return cell
            case .itemHintItem(let hint):
            ...
            case .itemManaColdownItem(let manacd):
            case .itemNotesItem(let notes):
            case .itemAttribItem(let attrib):
            case .itemLoreItem(let lore):
            case .itemComponentsItem(let components):

谁能帮我解决这个问题?非常感谢。

【问题讨论】:

圈复杂度随着每个控制语句(for、if、case 等)的增加而增加。这实际上更像是一个代码审查问题。您还可以研究如何降低圈复杂度。 非常感谢,我已经研究了很多次,但也许对我来说太难了:((( 【参考方案1】:

这里的解决方案是不要为您的单元格项目使用枚举。一个可能的解决方案如下:

struct DisplayableItem 
    let makeCell: (UITableView, IndexPath) -> UITableViewCell


struct ItemDetailDataSource 
    typealias DataSource = RxTableViewSectionedReloadDataSource
    
    static func dataSource() -> DataSource<ItemDetailTableViewSection> 
        .init  _, tableView, indexPath, item in
            item.makeCell(tableView, indexPath)
        
    

每个 DisplayableItem 都被赋予了制作 UITableViewCell 的方法。你可以使用上面的闭包,或者使用协议和一堆子类来实现。

【讨论】:

以上是关于如何解决气旋复杂性? - RxDataSource RxSwift - SwiftLint的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxDatasource 在 UICollectionView 中创建具有多个标题的多个部分

如何正确地将部分中的项目与 RxDataSource swift 结合起来?

Uber如何解决2000多个微服务带来的复杂性问题?

如何计算该解决方案的时间和空间复杂度?

解决时间复杂性,算法产生了什么?

时间复杂度如何从蛮力变为递归解决方案?