首页 > 解决方案 > 循环自日期以来的天/周/月/年(swift)

问题描述

我正在开发一个财务应用程序,用户可以在其中设置每日/每周/每月/每年的限制

我想创建一个显示这些限制的表:分组,从用户添加限制的日期到当前日期

今天是 2020 年 5 月 1 日


例子

用户在2020 年 4 月 15 日添加了“每周限制”

然后我想显示以下单元格:


示例 2

用户在2020 年 1 月 10 日添加了“每月限制”

然后我想显示以下单元格:


每日/每年的限制也是如此。

我怎么能做到这一点?

class Spare {
    static let shared = Spare()

    var limits : [Limit] = [] // Here do I store the limits

    func tableGenerateLimits() -> [Limit] {
        // ???
    }
}
class Limit : NSObject {

    var id : Double
    var date : Date
    var value : Int

    var type : LimitType = .weekly

    init(id : Double? = nil, date : Date, value: Int, type : LimitType){
        self.id = id ?? NSDate().timeIntervalSince1970
        self.date = date
        self.value = value
        self.type = type

        super.init()
    }
}

我完全迷失了

标签: swift

解决方案


首先,您可以创建一个Date()对象,然后使用一个Calendar对象来获取所有这些计算所需的值。

let date = Date()
let calendar = Calendar.current
var year = 0
var month = 0
var day = 0

然后,您可以通过执行此类操作获得特定的返回日期。

let toDate = Calendar.current.date(byAdding: .day, value: someDayFutureOrPast, to date)

一旦你将你的特定日期存储为一个变量,你就可以简单地把它从calendar类似的东西中取出来。

let year = calendar.component(.year, from: toDate!)
let month = calendar.component(.month, from: toDate!)
let day = calendar.component(.day, from: toDate!)

由于您正在使用单元格,因此您需要放置一种方法来从您的tableView(cellForRowAt...)方法中的某个地方或任何适合您的地方获取它。

这是一种可以得到你想要的东西的方法。为简单起见,我返回了一个元组,但您可以根据需要对其进行转换。对任何语法错误表示歉意。我不在我的 Mac 上,也不在我的 atm 附近。

func getDate(dateFromCurrent: Int) -> (Int, Int, Int) {
    let date = Date()
    let calendar = Calendar.current
    var year = 0
    var month = 0
    var day = 0
    let toDate = Calendar.current.date(byAdding: .day, value: someDayFutureOrPast, to date)

return (calendar.component(.year, from: toDate!), 
        calendar.component(.month, from: toDate!),
        calendar.component(.day, from: toDate!)
}

注意您可以BACK IN TIME通过将 更改someDayFutureOrPast为负整数来进行。


推荐阅读