Bagaimana cara menggunakan UserDefaults untuk menyimpan / mengambil string, boolean, dan data lainnya di Swift?
Bagaimana cara menggunakan UserDefaults untuk menyimpan / mengambil string, boolean, dan data lainnya di Swift?
Jawaban:
ref: NSUserdefault objectTypes
Toko
UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key") //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject
Ambil
UserDefaults.standard.bool(forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
UserDefaults.standard.string(forKey: "Key")
Menghapus
UserDefaults.standard.removeObject(forKey: "Key")
Hapus semua Kunci
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Toko
NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()
Ambil
var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]
Menghapus
NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")
registerDefaults: menambahkan RegistrationDictionary ke item terakhir di setiap daftar pencarian. Ini berarti bahwa setelah NSUserDefaults mencari nilai di setiap lokasi valid lainnya, nilai tersebut akan terlihat di default terdaftar, menjadikannya berguna sebagai nilai "fallback". Default terdaftar tidak pernah disimpan di antara jalannya aplikasi, dan hanya terlihat oleh aplikasi yang mendaftarkannya.
Nilai default dari File Konfigurasi Default akan secara otomatis didaftarkan.
misalnya mendeteksi aplikasi dari peluncuran, membuat struct untuk menyimpan peluncuran
struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
get {
return UserDefaults.standard.bool(forKey: keyforLaunch)
}
set {
UserDefaults.standard.set(newValue, forKey: keyforLaunch)
}
}
}
Daftarkan nilai default pada peluncuran aplikasi:
UserDefaults.standard.register(defaults: [
DetectLaunch.isFirst: true
])
hapus nilai pada penghentian aplikasi:
func applicationWillTerminate(_ application: UIApplication) {
DetectLaunch.isFirst = false
}
dan periksa kondisinya sebagai
if DetectLaunch.isFirst {
// app launched from first
}
satu lagi nama suite properti , sebagian besar digunakan untuk konsep Grup Aplikasi , contoh skenario yang saya ambil dari sini :
Kasus penggunaannya adalah saya ingin memisahkan UserDefaults saya (logika bisnis yang berbeda mungkin memerlukan Userdefaults untuk dikelompokkan secara terpisah) dengan pengenal seperti SharedPreferences Android. Misalnya, ketika pengguna di aplikasi saya mengklik tombol logout, saya ingin menghapus default terkait akunnya tetapi bukan lokasi perangkat.
let user = UserDefaults(suiteName:"User")
penggunaan sinkronisasi userDefaults , info detail telah ditambahkan dalam jawaban duplikat.
Cara terbaik untuk menggunakan UserDefaults
Langkah
Sampel
extension UserDefaults{
//MARK: Check Login
func setLoggedIn(value: Bool) {
set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
//synchronize()
}
func isLoggedIn()-> Bool {
return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}
//MARK: Save User Data
func setUserID(value: Int){
set(value, forKey: UserDefaultsKeys.userID.rawValue)
//synchronize()
}
//MARK: Retrieve User Data
func getUserID() -> Int{
return integer(forKey: UserDefaultsKeys.userID.rawValue)
}
}
enum untuk Kunci yang digunakan untuk menyimpan data
enum UserDefaultsKeys : String {
case isLoggedIn
case userID
}
Simpan di UserDefaults di tempat yang Anda inginkan
UserDefaults.standard.setLoggedIn(value: true) // String
UserDefaults.standard.setUserID(value: result.User.id!) // String
Ambil data di mana saja di aplikasi
print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()
Hapus Nilai
UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID)
Dengan cara ini Anda dapat menyimpan data primitif dengan baik
Perbarui Anda tidak perlu menggunakan sinkronisasi () untuk menyimpan nilai. Seperti @Moritz menunjukkan itu tidak perlu dan diberikan artikel tentangnya. Periksa komentar untuk detail lebih lanjut
synchronize()
, itu dijelaskan dalam dokumentasi. Ini tidak hanya tidak berguna di sini tetapi juga dapat memperlambat akses default.
Cepat 4 :
Toko
UserDefaults.standard.set(object/value, forKey: "key_name")
Retrive
var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]
Menghapus
UserDefaults.standard.removeObject(forKey:"key_name")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
Anda dapat menggunakan NSUserDefaults
dengan cepat dengan cara ini,
@IBAction func writeButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("defaultvalue", forKey: "userNameKey")
}
@IBAction func readButton(sender: UIButton)
{
let defaults = NSUserDefaults.standardUserDefaults()
let name = defaults.stringForKey("userNameKey")
println(name) //Prints defaultvalue in console
}
synchronize()
perintah untuk NSUserDefaults
untuk memastikan barang Anda disimpan setelah melakukan blok perubahan. Ini mungkin lebih diperlukan di iOS 7 dan sebelumnya, tetapi di iOS 8 dan seterusnya, Anda tidak boleh memanggil sinkronisasi () dalam banyak situasi. Periksa ini untuk Info lebih lanjut: codingexplorer.com/nsuserdefaults-a-swift-introduction
Swift 5 ke atas:
let defaults = UserDefaults.standard
defaults.set(25, forKey: "Age")
let savedInteger = defaults.integer(forKey: "Age")
defaults.set(true, forKey: "UseFaceID")
let savedBoolean = defaults.bool(forKey: "UseFaceID")
defaults.set(CGFloat.pi, forKey: "Pi")
defaults.set("Your Name", forKey: "Name")
defaults.set(Date(), forKey: "LastRun")
let array = ["Hello", "World"]
defaults.set(array, forKey: "SavedArray")
let savedArray = defaults.object(forKey: "SavedArray") as? [String] ?? [String()
let dict = ["Name": "Your", "Country": "YourCountry"]
defaults.set(dict, forKey: "SavedDict")
let savedDictionary = defaults.object(forKey: "SavedDictionary") as? [String: String] ?? [String: String]()
:)
Saya menyimpan NSDictionary secara normal dan bisa mendapatkannya dengan benar.
dictForaddress = placemark.addressDictionary! as NSDictionary
let userDefaults = UserDefaults.standard
userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)
// Untuk mendapatkan data dari NSDictionary.
let userDefaults = UserDefaults.standard
let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary
class UserDefaults_WorstPresidentName {
static let key = "appname.worstPresidentName"
static var value: String? {
get {
return UserDefaults.standard.string(forKey: key)
}
set {
if newValue != nil {
UserDefaults.standard.set(newValue, forKey: key)
} else {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}
UserDefault + Helper.swift
import UIKit
private enum Defaults: String {
case countryCode = "countryCode"
case userloginId = "userloginid"
}
final class UserDefaultHelper {
static var countryCode: String? {
set{
_set(value: newValue, key: .countryCode)
} get {
return _get(valueForKay: .countryCode) as? String ?? ""
}
}
static var userloginId: String? {
set{
_set(value: newValue, key: .userloginId)
} get {
return _get(valueForKay: .userloginId) as? String ?? ""
}
}
private static func _set(value: Any?, key: Defaults) {
UserDefaults.standard.set(value, forKey: key.rawValue)
}
private static func _get(valueForKay key: Defaults)-> Any? {
return UserDefaults.standard.value(forKey: key.rawValue)
}
static func deleteCountryCode() {
UserDefaults.standard.removeObject(forKey: Defaults.countryCode.rawValue)
}
static func deleteUserLoginId() {
UserDefaults.standard.removeObject(forKey: Defaults.userloginId.rawValue)
}
}
Pemakaian:
Simpan Nilai:
UserDefaultHelper.userloginId = data["user_id"] as? String
Ambil Nilai:
let userloginid = UserDefaultHelper.userloginId
Hapus Nilai:
UserDefaultHelper.deleteUserLoginId()
Saya akan mengatakan jawaban Anbu baik-baik saja tetapi saya harus menambahkan penjaga saat mengambil preferensi agar program saya tidak gagal
Berikut adalah potongan kode yang diperbarui di Swift 5
Menyimpan data di UserDefaults
@IBAction func savePreferenceData(_ sender: Any) {
print("Storing data..")
UserDefaults.standard.set("RDC", forKey: "UserName") //String
UserDefaults.standard.set("TestPass", forKey: "Passowrd") //String
UserDefaults.standard.set(21, forKey: "Age") //Integer
}
Mengambil data dari UserDefaults
@IBAction func fetchPreferenceData(_ sender: Any) {
print("Fetching data..")
//added guard
guard let uName = UserDefaults.standard.string(forKey: "UserName") else { return }
print("User Name is :"+uName)
print(UserDefaults.standard.integer(forKey: "Age"))
}
Di kelas A
, tetapkan nilai untuk kunci:
let text = "hai"
UserDefaults.standard.setValue(text, forKey: "textValue")
Di kelas B
, dapatkan nilai teks menggunakan kunci yang dideklarasikan di kelas A
dan tetapkan ke variabel terkait yang Anda butuhkan:
var valueOfText = UserDefaults.value(forKey: "textValue")
Swift 4, saya telah menggunakan Enum untuk menangani UserDefaults.
Ini hanyalah contoh kode. Anda dapat menyesuaikannya sesuai kebutuhan Anda.
Untuk Menyimpan, Mengambil, Menghapus. Dengan cara ini tambahkan saja kunci untuk kunci UserDefaults Anda ke enum. Tangani nilai sambil mendapatkan dan menyimpan sesuai dengan tipe data dan kebutuhan Anda.
enum UserDefaultsConstant : String {
case AuthToken, FcmToken
static let defaults = UserDefaults.standard
//Store
func setValue(value : Any) {
switch self {
case .AuthToken,.FcmToken:
if let _ = value as? String {
UserDefaults.standard.set(value, forKey: self.rawValue)
}
break
}
UserDefaults.standard.synchronize()
}
//Retrieve
func getValue() -> Any? {
switch self {
case .AuthToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) != nil) {
return "Bearer "+(UserDefaults.standard.value(forKey: UserDefaultsConstant.AuthToken.rawValue) as! String)
}
else {
return ""
}
case .FcmToken:
if(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) != nil) {
print(UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue))
return (UserDefaults.standard.value(forKey: UserDefaultsConstant.FcmToken.rawValue) as! String)
}
else {
return ""
}
}
}
//Remove
func removeValue() {
UserDefaults.standard.removeObject(forKey: self.rawValue)
UserDefaults.standard.synchronize()
}
}
Untuk menyimpan nilai dalam default pengguna,
if let authToken = resp.data?.token {
UserDefaultsConstant.AuthToken.setValue(value: authToken)
}
Untuk mengambil nilai dari userdefaults,
//As AuthToken value is a string
(UserDefaultsConstant.AuthToken.getValue() as! String)