Получение дат между начальной датой и конечной датой из массива в swift - PullRequest
0 голосов
/ 05 апреля 2019

Поскольку я новичок в swift, я застрял здесь очень долго, я пытаюсь получить дату из массива между начальной и конечной датой.

Я пробовал этот код, который ссылался на [https://stackoverflow.com/questions/10216991/fetching-dates-which-comes-between-startdate-and-enddate], But I am getting the error as "Value of type '[Date]' has no member 'filtered'".

В быстром

var predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
var result = arrayWithDates.filtered(using: predicate)

Expected output: 
dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
startdate = "13/01/1996" 
enddate = "17/01/1996"
output = ["13/01/1996","15/01/1996","17/01/1996"]

Пожалуйста, помогите мне достичь этого, спасибо заранее

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Вы можете попробовать ниже код, он работает для меня:

class ViewController: UIViewController {
var arrDates = NSArray()
var arrResultDates = NSMutableArray()
override func viewDidLoad() {
    super.viewDidLoad()

   arrDates = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
    let strStartDate = "\(arrDates.firstObject!)"
    let strEndDate = "\(arrDates.lastObject!)"
    let formatter  = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"
    //Get start date
    var startDate = formatter.date(from: strStartDate)
    let endDate = formatter.date(from: strEndDate) // last date

    // Formatter for printing the date, adjust it according to your needs:
    let fmt = DateFormatter()
    fmt.dateFormat = "dd/MM/yyyy"
    let calendar = NSCalendar.current
    while startDate! <= endDate! {

        startDate = calendar.date(byAdding: .day, value: 1, to: startDate!)!
        let strDate = fmt.string(from: startDate!)
        if arrDates.contains(strDate)
        {
            arrResultDates.add(strDate)
        }
    }

    print(arrResultDates)

}

Надеюсь, это поможет вам:)

0 голосов
/ 05 апреля 2019

Если вам действительно нужно использовать NSPredicate, вы должны соединить массив с NSArray, который отвечает на filtered(using:

let predicate = NSPredicate(format: "(SELF > %@) AND (SELF < %@)", startdate!, enddate!)
let result = (arrayWithDates as NSArray).filtered(using: predicate)

Однако в мире Swift это не рекомендуется. Просто используйте функцию filter с закрытием

let result = arrayWithDates.filter { $0 >= startdate! && $0 <= enddate! }
0 голосов
/ 05 апреля 2019

Вы можете сделать это так:

import Foundation

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")

let dateArray = ["12/01/1996","13/01/1996","15/01/1996","17/01/1996"]
let startdate = dateFormatter.date(from: "13/01/1996")!
let enddate = dateFormatter.date(from: "17/01/1996")!

let output = dateArray
    // Map your strings to Date objects excluding nils.
    .compactMap { dateFormatter.date(from: $0) }
    // Filter the mapped array by your condition.
    .filter { $0 >= startdate && $0 <= enddate }
...