Saya sedang mengerjakan aplikasi iPhone kecil, dan saya gunakan NSUserDefaults
sebagai ketekunan data saya. Itu hanya harus melacak beberapa hal, seperti beberapa nama dan beberapa angka jadi saya pikir saya mungkin juga tetap sederhana.
Saya menemukan halaman ini untuk referensi, tetapi saya rasa itu tidak bisa menjawab pertanyaan saya. Pada dasarnya, saya ingin dapat memeriksa apakah suatu nilai (atau kunci) sudah ada di NSUserDefaults
dan kemudian melakukan sesuatu yang sesuai.
Beberapa contoh: Aplikasi dijalankan, jika ini pertama kali dijalankan akan menampilkan peringatan yang mengatakan selamat datang. Untuk mengetahui apakah ini pertama kali dibuka, bacalah UserDefaults
dan periksa.
Contoh 2: Bunyinya, "Halo [Nama]", di mana Nama adalah sesuatu yang Anda masukkan. Jika Anda telah membuka aplikasi dan tidak ada nama, itu seharusnya mengatakan "Hello World." Saya perlu memeriksa apakah Anda sudah memasukkan nama dan bertindak sesuai. Nama akan disimpan di NSUserDefaults
.
Ada bantuan di sini? Saya sangat menghargainya!
sumber
– dictionaryRepresentation
dan memeriksa kuncinya.Seperti disebutkan di atas, ia tidak akan berfungsi untuk tipe primitif di mana 0 / NO bisa menjadi nilai yang valid. Saya menggunakan kode ini.
sumber
BOOL
. Ini akan secara akurat membedakan antaraNO
dan tidak diatur, tidak sepertiobjectForKey:
.objectForKey:
akan kembalinil
terlepas dari niat programmer untuk akhirnya menyimpanBool
atau tipe data lainnya. Ketika primitif hadir,objectForKey:
tidak kembalinil
bahkan jika kunci dikaitkan dengan nilai primitif.The
objectForKey:
Metode akan kembalinil
jika nilai tidak ada. Berikut adalah tes IF / THEN sederhana yang akan memberi tahu Anda jika nilainya nol:sumber
" objectForKey akan mengembalikan nihil jika tidak ada. " Ia juga akan mengembalikan nihil jika memang ada dan itu adalah bilangan bulat atau boolean dengan nilai nol (yaitu SALAH atau TIDAK untuk boolean).
Saya sudah menguji ini di simulator untuk 5.1 dan 6.1. Ini berarti bahwa Anda tidak dapat benar-benar menguji apakah bilangan bulat atau boolean telah ditetapkan dengan meminta "objek". Anda dapat menggunakan ini untuk bilangan bulat jika Anda tidak keberatan memperlakukan "tidak disetel" seolah-olah "disetel ke nol".
Orang-orang yang sudah menguji ini tampaknya telah dibodohi oleh aspek negatif palsu, yaitu menguji ini dengan melihat apakah objectForKey mengembalikan nol ketika Anda tahu kunci belum ditetapkan tetapi gagal untuk memperhatikan bahwa itu juga mengembalikan nol jika kunci telah diatur tetapi telah diatur ke NO.
Untuk masalah saya sendiri, yang mengirim saya ke sini, saya akhirnya mengubah semantik boolean saya sehingga default yang saya inginkan sesuai dengan nilai yang diatur ke NO. Jika itu bukan pilihan, Anda harus menyimpan sesuatu selain boolean dan memastikan bahwa Anda dapat membedakan antara YA, TIDAK, dan "tidak disetel."
sumber
@0
bukannya0
,@NO
bukannyaNO
, atau hanya@(variable)
. Baca tentang mereka di sini.Swift 3/4:
Berikut ini adalah ekstensi sederhana untuk tipe nilai kunci Int / Double / Float / Bool yang meniru perilaku pengembalian-opsional dari tipe lain yang diakses melalui UserDefaults.
( Sunting 30 Agustus 2018: Diperbarui dengan sintaksis yang lebih efisien dari saran Leo.)
Mereka sekarang lebih konsisten di samping metode get bawaan lainnya (string, data, dll.). Cukup gunakan metode get di tempat yang lama.
sumber
return self.object(forKey: key) as? Int
untuk mencari nilai hanya sekali.Saya baru saja melewati ini, dan semuanya jawaban Anda membantu saya menuju solusi yang baik, bagi saya. Saya menolak mengikuti rute yang disarankan, hanya karena saya merasa sulit untuk membaca dan memahami.
Inilah yang saya lakukan. Saya punya BOOL yang dibawa berkeliling dalam variabel yang disebut "_talkative".
Ketika saya menetapkan objek default (NSUserDefaults) saya, saya menetapkannya sebagai objek, yang kemudian dapat saya uji untuk melihat apakah nil:
Lalu ketika saya pergi untuk melihat apakah itu ada, saya menggunakan:
Kemudian saya menggunakan objek tersebut sebagai BOOL:
Ini sepertinya berhasil dalam kasus saya. Itu hanya lebih masuk akal secara visual bagi saya.
sumber
Coba crumpet kecil ini:
Perlakukan segala sesuatu sebagai objek. Tampaknya bekerja untuk saya.
sumber
Versi cepat untuk mendapatkan
Bool?
sumber
boolForKey
?NSUserDefaults.standardUserDefaults().boolForKey(DefaultsIsGiver)
boolForKey
akan kembaliBool
dan tidakBool?
, jadi jika kuncinya tidak ada Anda akan mendapatkanfalse
dan tidaknil
Perluas
UserDefaults
sekali untuk tidak menyalin-rekatkan solusi ini:sumber
Di Swift3, saya menggunakan cara ini
The Jawabannya adalah besar jika Anda menggunakan yang beberapa kali.
Saya harap ini membantu :)
sumber
Swift 3.0
sumber