如何将其分成 3 种方法.. thisYear、thisMonth 和 pastYear?

how to separate this into 3 methods.. the thisYear, thisMonth, and pastYear?

我想创建一个方法来分隔 thisYear、pastYear 和 thisMonth.. 如何创建一个方法来分离。谢谢。

func viewWillAppear(view: UIViewController) {
    
        totalRevenueThisCycleWorker.fetchAllRevenueList { (result) in
        
            switch result {
            case .success(let listRevenues):
                //thisYear
               let revenues = listRevenues.filter({ (domain) -> Bool in
                return domain.year == Date().year })
               
               var thisYearRevenueList: [Double] = []
               
               for totalThisYear in revenues {
                thisYearRevenueList.append(totalThisYear.revenue)
               }
               
               let totalRevenuesThisYear = thisYearRevenueList.reduce(0, +)
               let doubleRevenuesThisYear = Double(String(format: "%.2f", totalRevenuesThisYear))
               print("Total Revenues of Current Year  \(doubleRevenuesThisYear ?? 0) ")
               
                
                //thisMonth
                let months: [String] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
                var highestValue = listRevenues.max { x, y in x.month > y.month }
              
                let month = months[highestValue!.month + 1]
                print("COUNTED  \(month) ")
                
                let monthRevenues = listRevenues.filter({ (domain) -> Bool in
                    return domain.month == highestValue?.month })
                
                var monthRevenueList: [Double] = []
                
                for totalMonth in monthRevenues {
                    monthRevenueList.append(Double(totalMonth.revenue))
                }
                
                let totalRevenuesMonth = monthRevenueList.reduce(0 , +)
                let doubleRevenuesMonth = Double(String(format: "%.2f", totalRevenuesMonth))
                print("Total Revenues of Latest Month in Current Year \(doubleRevenuesMonth ?? 0) ")
               
              
               //pastYear
               let pastRevenues = listRevenues.filter({ (domain) -> Bool in
                return domain.year == Date().year - 1 })
               
               var pastYearRevenueList: [Double] = []
               
               for totalPastYear in pastRevenues {
                pastYearRevenueList.append(totalPastYear.revenue)
               }
               
               let totalRevenuesPastYear = pastYearRevenueList.reduce(0, +)
               print("Total Revenues of Past Year  \(totalRevenuesPastYear) ")
               
               let item = TotalRevenueModel(thisYearTotalRevenue: doubleRevenuesThisYear ?? 0, pastYearTotalRevenue: totalRevenuesPastYear, thisMonthTotalRevenue: doubleRevenuesMonth ?? 0, thisYearMonth: month)

               output?.showRevenues(amounting: item)
            case .failure(_): break
                
            }
    }
    
  }

我想创建一个方法来分隔 thisYear、pastYear 和 thisMonth.. 如何创建一个方法来分离。谢谢。

您可以将代码分解成 3 种方法 thisYear(listRevenues:), thisMonth(listRevenues), pastYear(listRevenues:)

func thisYear(listRevenues: [Revenue]) {
    let revenues = listRevenues.filter { [=10=].year == Date().year }
    let thisYearRevenueList = revenues.map{ [=10=].revenue }
    let totalRevenuesThisYear = thisYearRevenueList.reduce(0, +)
    let doubleRevenuesThisYear = Double(String(format: "%.2f", totalRevenuesThisYear))
    print("Total Revenues of Current Year  \(doubleRevenuesThisYear ?? 0) ")
}

func thisMonth(listRevenues: [Revenue]) {
    let months: [String] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    if let highestValue = listRevenues.max({ [=10=].month > .month }) {
        let month = months[highestValue.month + 1]
        print("COUNTED  \(month) ")
        let monthRevenues = listRevenues.filter { [=10=].month == highestValue.month }
        let monthRevenueList: [Double] = monthRevenues.map { Double([=10=].revenue) }
        let totalRevenuesMonth = monthRevenueList.reduce(0 , +)
        let doubleRevenuesMonth = Double(String(format: "%.2f", totalRevenuesMonth))
        print("Total Revenues of Latest Month in Current Year \(doubleRevenuesMonth ?? 0) ")
    }
}

func pastYear(listRevenues: [Revenue]) {
    let pastRevenues = listRevenues.filter { [=10=].year == Date().year - 1 }
    var pastYearRevenueList = pastRevenues.map { [=10=].revenue }
    let totalRevenuesPastYear = pastYearRevenueList.reduce(0, +)
    print("Total Revenues of Past Year  \(totalRevenuesPastYear) ")
    let item = TotalRevenueModel(thisYearTotalRevenue: doubleRevenuesThisYear ?? 0, pastYearTotalRevenue: totalRevenuesPastYear, thisMonthTotalRevenue: doubleRevenuesMonth ?? 0, thisYearMonth: month)
    output?.showRevenues(amounting: item)
}

现在调用方法,

switch result {
case .success(let listRevenues):
    self.thisYear(listRevenues: listRevenues) //thisYear
    self.thisMonth(listRevenues: listRevenues) //thisMonth
    self.pastYear(listRevenues: listRevenues) //pastYear
    
case .failure(_): break
}

修改代码为自己的数据类型,即将Revenue替换为listRevenues的类型。

注意:避免在不必要的情况下使用force-unwrapping(!)。