Pracuję nad małą aplikacją na iPhone'a i używam jej NSUserDefaults
do przechowywania danych. Musi tylko śledzić kilka rzeczy, takich jak niektóre nazwiska i niektóre liczby, więc myślę, że równie dobrze mogę to uprościć.
Znalazłem tę stronę w celach informacyjnych, ale nie sądzę, żeby mogła odpowiedzieć na moje pytanie. Zasadniczo chcę być w stanie sprawdzić, czy wartość (lub klucz) już istnieje w, NSUserDefaults
a następnie zrobić coś odpowiednio.
Kilka przykładów: aplikacja uruchamia się, jeśli uruchamia się po raz pierwszy, wyświetla komunikat ostrzegawczy powitania. Aby stwierdzić, czy po raz pierwszy został otwarty, czyta UserDefaults
i sprawdza.
Przykład 2: Napisano „Cześć [Nazwa]”, gdzie Nazwa to coś, co wpisałeś. Jeśli otworzyłeś aplikację i nie ma nazwy, powinna ona brzmieć „Hello World”. Muszę sprawdzić, czy już wpisałeś nazwisko i podjąć odpowiednie działania. Nazwa będzie przechowywana w NSUserDefaults
.
Jakaś pomoc tutaj? Byłbym bardzo wdzięczny!
źródło
– dictionaryRepresentation
i sprawdzić klucz.Jak wspomniano powyżej, nie będzie działać dla typów pierwotnych, w których 0 / NO może być prawidłową wartością. Używam tego kodu.
źródło
BOOL
. W odróżnieniu od tego dokładnie rozróżniaNO
i nie ustawiaobjectForKey:
.objectForKey:
zwrócinil
bez względu na zamiar programisty, aby ostatecznie zapisaćBool
jakiś inny typ danych. Gdy prymityw jest obecny,objectForKey:
nie zwraca,nil
nawet jeśli klucz jest powiązany z pierwotną wartością.objectForKey:
Metoda powrócinil
, jeśli wartość nie istnieje. Oto prosty test IF / THEN, który pokaże, czy wartość wynosi zero:źródło
„ objectForKey zwróci zero, jeśli nie istnieje. ” Zwróci również zero, jeśli istnieje i jest albo liczbą całkowitą, albo wartością logiczną o wartości zero (tj. FAŁSZ lub NIE dla wartości logicznej).
Przetestowałem to w symulatorze zarówno dla wersji 5.1, jak i 6.1. Oznacza to, że nie można tak naprawdę sprawdzić, czy zostały ustawione liczby całkowite lub logiczne, prosząc o „obiekt”. Możesz uniknąć tego dla liczb całkowitych, jeśli nie masz nic przeciwko traktowaniu „nieustawione” tak, jakby było „ustawione na zero”.
Wydaje się, że ludzie, którzy już to przetestowali, zostali oszukani przez fałszywie negatywny aspekt, tj. Testują to, sprawdzając, czy objectForKey zwraca zero, gdy wiesz, że klucz nie został ustawiony, ale nie zauważają, że zwraca również zero, jeśli klucz został ustawiony, ale został ustawiony na NIE.
W przypadku mojego problemu, który mnie tu przysłał, właśnie skończyłem na zmianie semantyki mojego logicznego loginu, tak że moje pożądane domyślne ustawienie było zgodne z wartością ustawioną na NIE. Jeśli nie jest to opcja, musisz zapisać jako coś innego niż wartość logiczna i upewnić się, że możesz odróżnić TAK, NIE i „nie ustawiono”.
źródło
@0
zamiast0
,@NO
zamiastNO
lub po prostu@(variable)
. Przeczytaj o nich tutaj.Swift 3/4:
Oto proste rozszerzenie dla typów klucz-wartość Int / Double / Float / Bool, które naśladują zachowanie Opcjonalnego powrotu innych typów dostępnych za pośrednictwem funkcji UserDefault.
( Edytuj 30 sierpnia 2018 r .: Zaktualizowano o bardziej wydajną składnię z sugestii Leo).
Są teraz bardziej spójne z innymi wbudowanymi metodami pobierania (ciąg, dane itp.). Po prostu użyj metod get zamiast starych.
źródło
return self.object(forKey: key) as? Int
, aby wyszukać wartość tylko raz.Właśnie to przeszedłem i wszystkie twoje odpowiedzi pomogły mi znaleźć dobre rozwiązanie. Oparłem się wytyczeniu trasy, którą zaproponowałem, tylko dlatego, że trudno mi było czytać i rozumieć.
Oto co zrobiłem. Miałem BOOL przenoszony w zmiennej o nazwie „_talkative”.
Kiedy ustawiam mój domyślny obiekt (NSUserDefaults), ustawiam go jako obiekt, ponieważ mogłem następnie przetestować, czy jest to zero:
Potem, gdy poszedłem sprawdzić, czy istnieje, użyłem:
Następnie użyłem obiektu jako BOOL:
To wydaje się działać w moim przypadku. Po prostu miało to dla mnie większy sens wizualny.
źródło
Wypróbuj ten mały crumpet:
Traktuj wszystko jak przedmiot. Wydaje się dla mnie pracować.
źródło
Szybka wersja do zdobycia
Bool?
źródło
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
wróciBool
i nieBool?
, więc jeśli nie będzie klucza, dostanieszfalse
i nienil
Przedłuż
UserDefaults
raz, aby nie kopiować-wkleić tego rozwiązania:źródło
W Swift3 korzystałem w ten sposób
Odpowiedź jest wielki, jeśli są w użyciu, że wiele razy.
Mam nadzieję, że to pomoże :)
źródło
Swift 3.0
źródło