Pracuję nad aplikacją, która wymaga sprawdzenia terminu zadania domowego. Chcę wiedzieć, czy termin wypada w następnym tygodniu, a jeśli tak, to wykonać czynność.
Większość dokumentacji, którą udało mi się znaleźć, znajduje się w Objective-C i nie mogę dowiedzieć się, jak to zrobić w Swift. Dzięki za pomoc!!
153
Date
klasę. Jest zmostkowanyNSDate
, ale nazywa sięDate
.Odpowiedzi:
Lubię używać rozszerzeń, aby kod był bardziej czytelny. Oto kilka rozszerzeń NSDate, które mogą pomóc w oczyszczeniu kodu i uczynieniu go łatwym do zrozumienia. Umieściłem to w pliku sharedCode.swift:
Teraz, jeśli możesz zrobić coś takiego:
źródło
return self.compare(dateToCompare) == NSComparisonResult.OrderedDescending
NSDateComponents
istnieje. Istnieje wiele przypadków brzegowych, które nie są odpowiednio uchwyt i nie ma sensu, aby nie dodawać do zgodnościComparable
doNSDate
. Poleciłbym skorzystać z rozwiązania Johna .date1 < date2
Jeśli chcesz wesprzeć
==
,<
,>
,<=
, lub>=
zaNSDate
s, po prostu trzeba zadeklarować to gdzieś:źródło
Comparable
jest potomkiemEquatable
protokołu, więc nie powinieneś deklarować zgodności z obydwoma.==
,<
,>
, itd., będziesz uzyskanie wyniku porównania ich adres w pamięci, nie porównania ich rzeczywistej wartości. W Swift nadal są traktowane jako referencje, więc myślę, że wybór polegał albo na (1) zachowaniu porównań według wskaźnika, tak jak w ObjC, lub (2) wyeliminowaniu zamieszania, nie zapewniając implementacji do porównań.Array.maxElement()
, że itd. Są wtedy automatycznie dostępne dla tablic NSDates.Oto jak porównujesz dwie NSDate w Swift, właśnie przetestowałem to na placu zabaw Xcode:
Aby więc sprawdzić, czy data
dueDate
przypada za tydzień od teraz:źródło
Zawsze robiłem to w jednej linii:
Nadal czytelne w
if
blokuźródło
W Swift3
Date
struktura wFoundation
now implementujeComparable
protokół. Tak więc poprzednieNSDate
metody Swift2 zostały zastąpione przez Swift3Date
.Uwaga ...
W Swift3
Date
oznaczastruct
to, że takvalue type
.NSDate
jestclass
, jestreference type
.źródło
źródło
Jeśli chcesz porównać daty z dokładnością (ten sam dzień lub rok itp.) W Swift 3.
W przypadku innych porównań kalendarza zmień .day na;
. rok. miesiąc. dzień. godzina. minuta. sekunda
źródło
Swift już zaimplementuj Porównanie dat po prostu użyj date1> date2 i tak dalej.
źródło
w Swift 3 data jest porównywalna, dzięki czemu możemy bezpośrednio porównywać daty, takie jak
lub alternatywnie
lepszy sposób tworzenia
extension
w Datestosowanie
let isGreater = date1.isGreater(than: date2)
źródło
Ta funkcja działała dla mnie w celu porównania, czy jedna data (startDate) była po endDate, gdzie obie zostały zdefiniowane jako zmienne NSDate:
źródło
wdrożenie w
Swift
źródło
źródło
dateAdded jest zmienną NSDate w moim obiekcie
źródło
Mamy scenariusz, aby sprawdzić, czy aktualny czas leży dwa razy (dwie daty).
Użyj prostego kodu.
źródło
W przypadku Swift 3 możesz użyć poniższej funkcji, aby porównać dwie daty.
toGranularity można zmienić zgodnie z ograniczeniami, do których chcesz zastosować porównanie.
źródło
Przedłużenie na SashaZ
Swift iOS 8 i nowsze Kiedy potrzebujesz czegoś więcej niż tylko większych lub mniejszych porównań dat. Na przykład, czy jest to ten sam dzień, czy też dzień poprzedni, ...
Uwaga: nigdy nie zapomnij o strefie czasowej. Strefa czasowa kalendarza ma domyślną, ale jeśli nie podoba Ci się ta domyślna, musisz samodzielnie ustawić strefę czasową. Aby wiedzieć, który jest dzień, musisz wiedzieć, o jaką strefę czasową pytasz.
Użyj tego w ten sposób:
Bardziej złożony przykład. Znajdź i odfiltruj wszystkie daty w tablicy, które pochodzą z tego samego dnia co „findThisDay”:
źródło