Jaka jest różnica między precondition(condition: Bool, message: String)
i assert(condition: Bool, message: String)
w języku Swift?
Oba wyglądają dla mnie tak samo. W jakim kontekście powinniśmy używać jednego nad drugim?
assert
służy do sprawdzania poczytalności podczas testowania, natomiast precondition
służy do ochrony przed rzeczami, które w przypadku ich wystąpienia oznaczałyby, że program nie mógłby po prostu działać.
Na przykład, możesz zastosować assert
jakieś obliczenia, które dają rozsądne wyniki (powiedzmy w pewnych granicach), aby szybko sprawdzić, czy masz błąd. Ale nie chciałbyś tego wysyłać, ponieważ wynik poza zakresem może być prawidłowy i nie krytyczny, więc nie powinieneś zawieszać aplikacji (przypuśćmy, że używałeś go tylko do wyświetlania postępu na pasku postępu).
Z drugiej strony, sprawdzenie, czy indeks w tablicy jest prawidłowy podczas pobierania elementu, to precondition
. Nie ma sensownej następnej akcji, jaką obiekt tablicy miałby podjąć, gdy zostanie poproszony o niepoprawny indeks, ponieważ musi zwrócić nie opcjonalną wartość.
Pełny tekst z dokumentów (spróbuj kliknąć opcję assert
i precondition
Xcode):
Warunek wstępny
Sprawdź warunek konieczny do postępu.
Użyj tej funkcji, aby wykryć warunki, które muszą uniemożliwić działanie programu nawet w kodzie wysyłkowym.
W placach zabaw i kompilacjach -Onone (wartość domyślna dla konfiguracji debugowania Xcode): jeśli
condition
wartość ma wartość false, po wydrukowaniu zatrzymaj wykonywanie programu w stanie możliwym do debugowaniamessage
.Kompilacje In -O (wartość domyślna dla konfiguracji wydania Xcode): jeśli
condition
wartość ma wartość false, zatrzymaj wykonywanie programu.W kompilacjach -Ounchecked
condition
nie jest oceniany, ale optymalizator może założyć, że zostanie oszacowanytrue
. Niespełnienie tego założenia w kompilacjach -Ounchecked jest poważnym błędem programistycznym.
Zapewniać
Tradycyjne potwierdzenie w stylu C z opcjonalną wiadomością.
Użyj tej funkcji do wewnętrznych kontroli poprawności, które są aktywne podczas testowania, ale nie wpływają na wydajność kodu wysyłkowego. Aby sprawdzić nieprawidłowe użycie w kompilacjach wydania; zobacz
precondition
.
W placach zabaw i kompilacjach -Onone (wartość domyślna dla konfiguracji debugowania Xcode): jeśli
condition
wartość ma wartość false, po wydrukowaniu zatrzymaj wykonywanie programu w stanie możliwym do debugowaniamessage
.Kompilacje In -O (domyślne dla konfiguracji wydania Xcode)
condition
nie są oceniane i nie ma żadnych efektów.W kompilacjach -Ounchecked
condition
nie jest oceniany, ale optymalizator może założyć, że zostanie oszacowanytrue
. Niespełnienie tego założenia w kompilacjach -Ounchecked jest poważnym błędem programistycznym.
data["name"]
nie istnieje, a powinna. Posiadanie asertu wewnątrz strażnika ... else {} pomogłoby mi złapać mój błąd przez awarię i doprowadzenie mnie do problemu. Podobnie, gdyby ten kod był w produkcji, assert nie spowodowałby awarii programu, areturn nil
każdy kod zapasowy, którego użyłem ( ), by go przejął.Zauważyłem, że pomocny jest program Swift Asserts - brakująca instrukcja
Oraz z ciekawych dyskusji na temat Swift Evolution
Musisz także uważać na to, czego użyć, zobacz assertionFailure i Optimization Level
źródło
precondition()
ipreconditionFailure()
są o tych samych zachowań . Różnica między tymi funkcjami jest taka:precondition
potrzebujesz warunku w środku, apreconditionFailure
po prostu wyrzuć.precondition
Jest aktywny w trybie zwolnienia Więc kiedy wysyłamy swoją aplikację, a warunek udało aplikacja zakończy.Assert
działa domyślnie tylko w trybie debugowania.Znalazłem świetne wyjaśnienie, kiedy używać go na NSHipster:
źródło
Sprawdź warunek konieczny do postępu.
Tradycyjne potwierdzenie w stylu C z opcjonalną wiadomością.
Użyj tej funkcji do wewnętrznych kontroli poprawności, które są aktywne podczas testowania, ale nie wpływają na wydajność kodu wysyłkowego. Aby sprawdzić nieprawidłowe użycie w kompilacjach wydania; patrz warunek wstępny.
W placach zabaw i kompilacjach -Onone (domyślne dla konfiguracji debugowania Xcode): jeśli warunek ma wartość false, po wydrukowaniu komunikatu zatrzymaj wykonywanie programu w stanie możliwym do debugowania.
źródło
Chciałem tylko dodać moje 2 centy. Możesz dodać dowolną liczbę potwierdzeń w swoim kodzie, ile chcesz. Możesz wysłać swój kod z tymi potwierdzeniami. Swift NIE ocenia tych bloków kodu dla aplikacji produkcyjnych. Są one oceniane tylko w przypadku trybu debugowania.
Dodanie linku do dokumentacji
Załączam również obraz ze swift.org
Należy również zauważyć, że nie dotyczy to warunków wstępnych. Kod wysłany z warunkami wstępnymi ulegnie awarii, a aplikacja zostanie zamknięta, jeśli warunki wstępne nie zostaną ocenione jako prawdziwe.
Krótko mówiąc, asercje służą do debugowania, ale mogą być wysyłane bez wpływu na produkcję. Asercje będą oceniane w trybie debugowania, ale nie w środowisku produkcyjnym.
I
Warunki wstępne służą do zapobiegania nieoczekiwanym rzeczom w środowisku produkcyjnym. Te warunki są oceniane i spowodują zamknięcie aplikacji w przypadku, gdy zostaną ocenione jako fałszywe
źródło