如何减少if条件循环-Swift

如何减少if条件循环-Swift,swift,performance,loops,if-statement,reduce,Swift,Performance,Loops,If Statement,Reduce,我知道这听起来很疯狂,但我只是好奇如何减少下面的if循环迭代?我试过使用警卫let,但在某些地方失灵了 { if arenaEventItems == nil || arenaEventItems.count <= 0 { return } if (arenaEventItems.count > 0 && (self.arenaEvents?.monthsDictObjList.count)! &

我知道这听起来很疯狂,但我只是好奇如何减少下面的if循环迭代?我试过使用
警卫let
,但在某些地方失灵了

{
        if arenaEventItems == nil || arenaEventItems.count <= 0 {
            return
        }
        if (arenaEventItems.count > 0 && (self.arenaEvents?.monthsDictObjList.count)! > 0){
            if (self.tableView != nil){
            if let arrVisibleRows = self.tableView.indexPathsForVisibleRows as? [IndexPath]{
                if (self.tableView.indexPathsForVisibleRows!.count > 0){
                    let indexPath : IndexPath =   self.tableView.indexPathsForVisibleRows!.first!
                    if let dict  = self.arenaEvents?.monthsDictObjList[indexPath.row] {
                        if(self.arenaHeaderView != nil) && (dict.count) > 0 {
                            self.arenaHeaderView?.setMonthTitle(string: (dict.keys.first!))
                            let selectedMonthTitle = (dict.keys.first!)

                            for month in  (self.arenaEvents?.uniqueMonthOnlyList)! {
                                if (selectedMonthTitle.contains(month)){
                                    selectedMonthIndex = (self.arenaEvents?.uniqueMonthOnlyList.index(of: month)!)!
                                    break
                                }
                            }
                        }
                    }
                }
            }
         }
       }
    }
{
如果arenaEvents==nil | | arenaEvents.count 0&(self.arenaEvents?monthsDictObjList.count)!>0){
if(self.tableView!=nil){
如果让arrVisibleRows=self.tableView.indexPathsForVisibleRows为?[IndexPath]{
if(self.tableView.indexPathsForVisibleRows!.count>0){
让indexPath:indexPath=self.tableView.indexPathsForVisibleRows!。首先!
如果让dict=self.arenaEvents?.monthDictObjList[indexPath.row]{
如果(self.arenaHeaderView!=nil)&(dict.count)>0{
self.arenaHeaderView?.setMonthTitle(字符串:(dict.keys.first!))
让selectedMonthTitle=(dict.keys.first!)
(self.arenaEvents?.uniqueMonthOnlyList)中的月份{
如果(已选择MonthTitle.contains(月)){
selectedMonthIndex=(self.arenaEvents?.uniqueMonthOnlyList.index(of:month)!)!
打破
}
}
}
}
}
}
}
}
}

您可以将“if”中的所有条件组合起来,得到如下结果:

if let eventItems = arenaEventItems,
   eventItems.count > 0,
   let events = self.arenaEvents,
   !events.monthsDictObjList.isEmpty,
   let tableView = self.tableView,
   let arrVisibleRows = self.tableView.indexPathsForVisibleRows as? [IndexPath],
   !arrVisibleRows.isEmpty,
   let indexPath : IndexPath = arrVisibleRows.first,
   let dict = events.monthsDictObjList[indexPath.row],
   let headerView = self.arenaHeaderView,
   !dict.isEmpty {
        headerView.setMonthTitle(string: (dict.keys.first!))
        let selectedMonthTitle = (dict.keys.first!)

        for month in events.uniqueMonthOnlyList! {
            if (selectedMonthTitle.contains(month)){
                selectedMonthIndex = (events.uniqueMonthOnlyList.index(of: month)!)!
                break
            }
        }
    }

您可以这样减少,而无需任何强制展开或嵌套:

guard let arenaEventItems = arenaEventItems,
    !arenaEventItems.isEmpty,
    let arenaEvents = self.arenaEvents,
    !arenaEvents.monthsDictObjList.isEmpty,
    let arenaHeaderView = self.arenaHeaderView,
    let indexPath = self.tableView?.indexPathsForVisibleRows?.first,
    let selectedMonthTitle = arenaEvents.monthsDictObjList[indexPath.row].keys.first
    else {
        return
}
arenaHeaderView.setMonthTitle(string: selectedMonthTitle)
if let monthIndex = arenaEvents.uniqueMonthOnlyList.index(where: { selectedMonthTitle.contains($0) }) {
    selectedMonthIndex = monthIndex
}
  • 如果。。。返回带有
    防护装置的
    !。。。否则返回
    ,以避免嵌套
  • .count>0
    替换为
    !。。。isEmpty
    作为最佳实践
  • 如果让something=self.something来避免线程问题,则将对self.something?的多重访问替换为
  • 您为…卸载
    。。。在里面{if(…){…}
    .index(其中:…)

你应该考虑重构你的代码,你的代码对于任何看它的人来说都是不可读的和不可理解的。由于您使用的是Swift,因此使用guard编写这样的代码非常容易。。。如果。。。让 模式

在类上可以做的一些改进是将视图设置为非零,即使它们隐式展开为可选,因为您将始终将它们连接到情节提要

 @IBOutlet var tableView: UITableView!
 @IBOutlet var arenaHeaderView: ArenaHeaderView!
另外,您有可以变为nil的数组,为什么希望它变为nil呢。您可以简单地初始化一个空数组和字典。这样就可以减少更多的比较代码

arenaEventItems: [String: String] = [:]
通过这些更改和一些重构,您可能会将代码重写为这样的内容

guard !arenaEventItems.isEmpty,
    let arenaEvents = arenaEvents,
    let indexPath = tableView.indexPathsForVisibleRows?.first,
    let dict = arenaEvents.monthsDictObjList[indexPath.row],
    let selectedMonthTitle = dict.keys.first

    else {
        return
}

arenaHeaderView.setMonthTitle(string: selectedMonthTitle)

for month in arenaEvents.uniqueMonthOnlyList where selectedMonthTitle.contains(month) {
    if let selectedIndex = arenaEvents.uniqueMonthOnlyList.index(of: month) {
        selectedMonthIndex = selectedIndex
        break
    }
}

您没有遵守Swift语言指南。混合
nil
检查
可选绑定多次。不必要的注释类型
indepath
。嵌套的
if
条件可以组合使用。还有很多…@PriyankaMistry别忘了给有用的答案投票,并接受带有绿色复选标记的最有用的答案。:)<代码>用于。。。在里面{if(…){…}
构造可以简化为
for。。。在里面哪里{…}
,如events.uniquemontonlylist中月份的
!其中selectedMonthTitle.contains(month){selectedMonthIndex=…}
。而即时的
中断
可以通过
事件进一步简化。uniquemontonlylist!。首先(where:{…})…
这正是您应该使用
guard let
的情况。如果
无法阅读,请输入长的
。感谢您提供简短的详细信息。将尝试在此处实施和更新。感谢您提出最佳做法。也将尝试此代码。:)