Swift 5+
Żadna z odpowiedzi tak naprawdę nie obejmuje szczegółowo domyślnych wbudowanych funkcji lokalnej pamięci masowej. Potrafi znacznie więcej niż tylko struny.
Dostępne są następujące opcje pochodzące bezpośrednio z dokumentacji Apple dotyczące „pobierania” danych z ustawień domyślnych.
func object(forKey: String) -> Any?
//Returns the object associated with the specified key.
func url(forKey: String) -> URL?
//Returns the URL associated with the specified key.
func array(forKey: String) -> [Any]?
//Returns the array associated with the specified key.
func dictionary(forKey: String) -> [String : Any]?
//Returns the dictionary object associated with the specified key.
func string(forKey: String) -> String?
//Returns the string associated with the specified key.
func stringArray(forKey: String) -> [String]?
//Returns the array of strings associated with the specified key.
func data(forKey: String) -> Data?
//Returns the data object associated with the specified key.
func bool(forKey: String) -> Bool
//Returns the Boolean value associated with the specified key.
func integer(forKey: String) -> Int
//Returns the integer value associated with the specified key.
func float(forKey: String) -> Float
//Returns the float value associated with the specified key.
func double(forKey: String) -> Double
//Returns the double value associated with the specified key.
func dictionaryRepresentation() -> [String : Any]
//Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.
Oto opcje „ustawienia”
func set(Any?, forKey: String)
//Sets the value of the specified default key.
func set(Float, forKey: String)
//Sets the value of the specified default key to the specified float value.
func set(Double, forKey: String)
//Sets the value of the specified default key to the double value.
func set(Int, forKey: String)
//Sets the value of the specified default key to the specified integer value.
func set(Bool, forKey: String)
//Sets the value of the specified default key to the specified Boolean value.
func set(URL?, forKey: String)
//Sets the value of the specified default key to the specified URL.
Jeśli przechowujesz takie rzeczy, jak preferencje, a nie duży zestaw danych, są to doskonałe opcje.
Podwójny przykład :
Oprawa:
let defaults = UserDefaults.standard
var someDouble:Double = 0.5
defaults.set(someDouble, forKey: "someDouble")
Pierwsze:
let defaults = UserDefaults.standard
var someDouble:Double = 0.0
someDouble = defaults.double(forKey: "someDouble")
Co ciekawe w jednym z getterów jest DictionaryRepresentation , ten poręczny getter weźmie wszystkie typy danych, niezależnie od tego, czym one są i umieści je w ładnym słowniku, do którego można uzyskać dostęp za pomocą nazwy ciągu i poda poprawny odpowiedni typ danych, gdy o to poprosisz to z powrotem, ponieważ jest typu „any” .
Można przechowywać własnych klas i obiektów, również za pomocą func set(Any?, forKey: String)
i func object(forKey: String) -> Any?
setter i getter odpowiednio.
Mam nadzieję, że to wyjaśnia więcej możliwości klasy UserDefaults do przechowywania danych lokalnych.
Pamiętając o tym, ile należy przechowywać i jak często, Hardy_Germany udzielił dobrej odpowiedzi na to w tym poście , oto cytat z tego
Jak wielu już wspomniało: nie jestem świadomy żadnych ograniczeń SIZE (poza pamięcią fizyczną) do przechowywania danych w .plist (np. UserDefaults). Więc to nie jest kwestia ILE.
Prawdziwe pytanie powinno brzmieć JAK CZĘSTO wpisujesz nowe / zmienione wartości ... A to jest związane z wyczerpaniem baterii, które spowoduje to zapisywanie.
IOS nie ma szans na uniknięcie fizycznego zapisu na „dysku” w przypadku zmiany jednej wartości, tylko po to, aby zachować integralność danych. W przypadku opcji UserDefaults powoduje to przepisanie całego pliku na dysk.
Powoduje to włączenie „dysku” i przedłużenie jego zasilania, a także zapobiega przejściu systemu IOS do stanu niskiego poboru mocy.
Coś jeszcze, o czym wspomniał użytkownik Mohammad Reza Farahani z tego postu, to asynchroniczny i synchronicznyInną rzeczą wartą charakter userDefaults.
Po ustawieniu wartości domyślnej jest ona zmieniana synchronicznie w ramach procesu i asynchronicznie na trwały magazyn i inne procesy.
Na przykład, jeśli zapiszesz i szybko zamkniesz program, możesz zauważyć, że nie zapisuje on wyników, jest tak, ponieważ utrzymuje się asynchronicznie. Możesz nie zauważyć tego przez cały czas, więc jeśli planujesz oszczędzać przed zamknięciem programu, możesz to uwzględnić, dając mu trochę czasu na zakończenie.
Może ktoś ma na to fajne rozwiązania, którymi mógłby się podzielić w komentarzach?