Bagaimana saya bisa menggunakan UserDefaults di Swift?


119

Bagaimana cara menggunakan UserDefaults untuk menyimpan / mengambil string, boolean, dan data lainnya di Swift?


4
Saya membuka kembali pertanyaan ini karena dapat dijadikan sebagai pertanyaan umum yang baik tentang topik ini. Jawaban yang diterima juga lebih jelas daripada duplikat yang ditandai sebelumnya , yang juga lebih spesifik dari pertanyaan ini.
Suragch


Saya rasa pertanyaan ini tersedia di stack overflow yang harus Anda cari sebelum menambahkan pertanyaan di sini
Yogesh Patel

Jawaban:


330

ref: NSUserdefault objectTypes

Swift 3 ke atas

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)
 }

Swift 2 ke bawah

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")


Daftar

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
}

Nama suite UserDefaults

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.


Kapan dan di mana Anda harus memanggil metode penyimpanan? Tepat sebelum aplikasi ditutup atau setiap kali nilainya berubah?
josef

cukup mengagumkan, satu tempat untuk semua jenis operasi.
michaeln peterson

@ Anbu.Karthik bagaimana Anda akan memperbarui nilai untuk kunci di default pengguna?
sathya chinnasamy

2
@RajeshBaidya - userdefault selalu menyimpan nilai akhir saja
Anbu.Karthik

Apakah data ini tetap ada melalui penginstalan / pencopotan aplikasi?
OrangePot

40

Cara terbaik untuk menggunakan UserDefaults

Langkah

  1. Buat ekstensi dari UserDefaults
  2. Buat enum dengan kunci yang diperlukan untuk disimpan di lokal
  3. Simpan dan ambil data lokal di mana pun Anda inginkan

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


Anda tidak perlu synchronize(), itu dijelaskan dalam dokumentasi. Ini tidak hanya tidak berguna di sini tetapi juga dapat memperlambat akses default.
Eric Aya

Ya itu disebutkan di dok. Setelah data default diubah, data akan disimpan secara otomatis tetapi dalam beberapa kasus, nilai Anda mungkin tidak disimpan, yaitu asynchronous. Jadi saya pikir lebih baik untuk menyinkronkan.
iSrinivasan27

2
Itu tidak lebih baik - bahkan terkadang menjadi sumber masalah. Jangan gunakan sinkronisasi, itu sudah usang dan bermasalah. Lihat codingexplorer.com/nsuserdefaults-a-swift-introduction khususnya bagian "update". Saya juga menjalankan banyak tes tentang ini dan menghapus semua panggilan untuk sinkronisasi di semua aplikasi saya dan tidak pernah memiliki masalah bahkan dalam situasi yang mengerikan. Tapi, hei, jika Anda menyukai hal-hal tidak berguna yang dapat memperlambat aplikasi Anda, hubungi sinkronisasi ... tentu ...;)
Eric Aya

Ini sangat membantu. Saya telah mengomentari sync (). Menggunakan sync () berdasarkan kebutuhan.
iSrinivasan

hai cara menyimpan data di nsuserdefaults dalam file terpisah dengan cepat
Dilip Tiwari

15

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") 

apa yang Anda maksud dengan baris 'UserDefaults.standard.synchronize ()' ini sebagai opsional? @Nikunjoshi
Nishad Arora

2
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")

//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")

Dalam Swift 3: let minutes = UserDefaults.standard.object (forKey: "minutes") as! String
Alessandro Mattiuzzi

2

Anda dapat menggunakan NSUserDefaultsdengan 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
}

2
Versi pertama dari posting ini mengatakan menggunakan synchronize()perintah untuk NSUserDefaultsuntuk 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
Dharmesh Kheni

2

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]()

:)


1

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

Terima kasih atas bantuan Anda, nona. :)
Venkatesh

1
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)
            }
        }
    }
}

1

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()

1

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"))
    }

0

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 Adan tetapkan ke variabel terkait yang Anda butuhkan:

var valueOfText  = UserDefaults.value(forKey: "textValue")

0

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.