Как добавить недельные, месячные и годовые интервалы к дате в al oop? - PullRequest
0 голосов
/ 09 июля 2020

Я добавляю элементы в массив с l oop для добавления в Realm.

var transactionArray:[Transaction] = []

for _ in 1...numberOfTransactionsToAdd {

            let addedTransaction = Transaction()
            
            addedTransaction.transactionAmount = amount
            addedTransaction.transactionName = name
            addedTransaction.transactionDescription = desc
            addedTransaction.transactionDate = datePicked
            addedTransaction.transactionCategory = category

            transactionArray.append(addedTransaction)
        }

let transactionList = List<Transaction>()
        
        
        for transaction in transactionArray {
            
            transactionList.append(transaction)
            
        }
        
        try! realm.write {
            realm.add(transactionList)
        }

Этот код работает отлично, но сохраняет все транзакции в один и тот же день.

Мне нужно сделать их повторяющимися транзакциями, добавив к дате недельные и ежемесячные интервалы времени.

Я попытался создать вложенный для l oop, чтобы добавить компоненты даты:

for _ in 0...1 {
                datePicked = Calendar.current.date(byAdding: timeComponent, to: datePicked)!
            }

И я пробовал добавлять время на несколько недель, но месяцами это не сработает:

for _ in 0...7 {
                datePicked = datePicked + 24*60*60
            }

Как мне добавить эти объекты addedTransaction с недельными и ежемесячными интервалами?

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Существует существующий ответ, но он основан на стороннем модуле, что неплохо, но если бы он не обновлялся в будущем, это сделало бы ответ недействительным. Кроме того, используемые объекты четко не определены.

TL; DR - нет необходимости в списке или массиве. Запишите транзакции по мере их создания и заполнения.

Подробности:

Итак, вот более полный ответ Swift, начиная с объекта TransactionClass Realm, который имеет удобный инициализатор для даты транзакции как а также первичный ключ, который обычно рекомендуется использовать для объектов.

class TransactionClass: Object {
    @objc dynamic var transaction_id = UUID().uuidString
    @objc dynamic var date_picked = Date()
    convenience init(theDate: Date) {
        self.init()
        self.date_picked = theDate
    }
    override static func primaryKey() -> String? {
        return "transaction_id"
    }
}

Затем функция, которая создает ряд повторяющихся транзакций на основе selectedDate

let datePicked = Date() //using today as an example, insert your date here
let numMonths = 12 //recurring for 12 months
var dateComponent = DateComponents()

for index in 0..<numMonths {
    dateComponent.month = index
    if let futureDate = Calendar.current.date(byAdding: dateComponent, to: datePicked) {
        let t = TransactionClass(theDate: futureDate)
        try! realm.write {
            realm.add(t)
        }
    }
}

и вывод при печати

2020-07-12 13:30:32 +0000
2020-08-12 13:30:32 +0000
2020-09-12 13:30:32 +0000
2020-10-12 13:30:32 +0000
2020-11-12 14:30:32 +0000
2020-12-12 14:30:32 +0000
2021-01-12 14:30:32 +0000
2021-02-12 14:30:32 +0000
2021-03-12 14:30:32 +0000
2021-04-12 13:30:32 +0000
2021-05-12 13:30:32 +0000
2021-06-12 13:30:32 +0000
1 голос
/ 09 июля 2020

Если я правильно понял ваш вопрос, вы можете попробовать следующее:

for _ in 1...numberOfTransactionsToAdd {
    let addedTransaction = Transaction()

    addedTransaction.transactionAmount = amount
    addedTransaction.transactionName = name
    addedTransaction.transactionDescription = desc
    addedTransaction.transactionCategory = category
    
    // specify your date components (add month, day, whatever you need)
    var dateComponent = DateComponents() 
    dateComponent.day = 1
    dateComponent.month = 2
    // add the date components to `datePicked`
    let newDate = Calendar.current.date(byAdding: dateComponent, to: datePicked)!
    // set `transactionDate` to your new date
    addedTransaction.transactionDate = newDate

    transactionArray.append(addedTransaction)
}
0 голосов
/ 11 июля 2020

Вот как я решил эту дилемму:

Я использовал SwiftDate https://cocoapods.org/pods/SwiftDate, чтобы упростить работу с датами.

Я добавил месяц к datePicked в конце l oop, после transactionArray.append. Таким образом, первая дата транзакции совпадает с выбранной датой.

Вот как выглядит код:

func saveMultipleTransactions() {
        
        var transactionArray:[Transaction] = []
        
        let numberOfTransactionsToAdd = 12
        
        for _ in 1...numberOfTransactionsToAdd {
            
            let addedTransaction = Transaction()
                        
            addedTransaction.transactionAmount = amount
            addedTransaction.transactionName = name
            addedTransaction.transactionDescription = desc
            addedTransaction.transactionDate = datePicked
            addedTransaction.transactionCategory = category
            
            transactionArray.append(addedTransaction)
            
            datePicked = datePicked + 1.months
            
        }
        
        let transactionList = List<Transaction>()
        
        
        for transaction in transactionArray {
            
            transactionList.append(transaction)
            
        }
        
        try! realm.write {
            realm.add(transactionList)
        }
    }

Я планирую расширить функциональность, чтобы сделать ее более универсальной, но это это то, что сработало для меня (пока).

...