UserDefaults'u Swift'de nasıl kullanabilirim?


119

Swift'de dizeleri, boole'leri ve diğer verileri kaydetmek / almak için UserDefaults'u nasıl kullanabilirim?


4
Bu soruyu yeniden açıyorum çünkü bu konu hakkında iyi bir genel soru olarak hizmet edebilir. Kabul edilen cevap, aynı zamanda bu sorudan daha spesifik olan, önceki işaretli kopyadan daha nettir .
Suragch


Bu sorunun yığın taşmasında mevcut olduğunu düşünüyorum, buraya soru eklemeden önce aramanız gerekiyor
Yogesh Patel

Yanıtlar:


331

ref: NSUserdefault objectTypes

Swift 3 ve üstü

mağaza

UserDefaults.standard.set(true, forKey: "Key") //Bool
UserDefaults.standard.set(1, forKey: "Key")  //Integer
UserDefaults.standard.set("TEST", forKey: "Key") //setObject

geri almak

 UserDefaults.standard.bool(forKey: "Key")
 UserDefaults.standard.integer(forKey: "Key")
 UserDefaults.standard.string(forKey: "Key")

Kaldırmak

 UserDefaults.standard.removeObject(forKey: "Key")

Tüm Anahtarları Kaldır

 if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
 }

Swift 2 ve altı

mağaza

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "yourkey")
NSUserDefaults.standardUserDefaults().synchronize()

geri almak

  var returnValue: [NSString]? = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as? [NSString]

Kaldırmak

 NSUserDefaults.standardUserDefaults().removeObjectForKey("yourkey")


Kayıt ol

registerDefaults: RegistrationDictionary'yi her arama listesindeki son öğeye ekler. Bu, NSUserDefaults diğer her geçerli konumda bir değer aradıktan sonra, kayıtlı varsayılanlara bakacağı ve onları bir "geri dönüş" değeri olarak kullanışlı hale getireceği anlamına gelir. Kayıtlı varsayılanlar hiçbir zaman bir uygulamanın çalıştırılması arasında depolanmaz ve yalnızca bunları kaydeden uygulama tarafından görülebilir.

Varsayılan Yapılandırma Dosyalarındaki varsayılan değerler otomatik olarak kaydedilecektir.

örneğin uygulamanın başlatılmasından itibaren algılamak, başlatma kaydetme için yapı oluşturmak

struct DetectLaunch {
static let keyforLaunch = "validateFirstlunch"
static var isFirst: Bool {
    get {
        return UserDefaults.standard.bool(forKey: keyforLaunch)
    }
    set {
        UserDefaults.standard.set(newValue, forKey: keyforLaunch)
    }
}
}

Uygulama başlatıldığında varsayılan değerleri kaydedin:

UserDefaults.standard.register(defaults: [
        DetectLaunch.isFirst: true
    ])

uygulama sonlandırmadaki değeri kaldırın:

func applicationWillTerminate(_ application: UIApplication) {
    DetectLaunch.isFirst = false

}

ve durumu şu şekilde kontrol edin:

if DetectLaunch.isFirst {
  // app launched from first
}

UserDefaults paket adı

başka bir özellik paketi adı , çoğunlukla Uygulama Grupları konsepti için kullanılıyor , buradan aldığım örnek senaryo :

Kullanım durumu, Kullanıcı Varsayılanlarımı (farklı iş mantığı, Kullanıcı varsayılanlarının ayrı olarak gruplandırılmasını gerektirebilir), tıpkı Android'in Paylaşılan Tercihleri ​​gibi bir tanımlayıcıyla ayırmak istememdir. Örneğin, uygulamamdaki bir kullanıcı çıkış düğmesine tıkladığında, cihazın konumunu değil, hesabıyla ilgili varsayılanları temizlemek isterim.

let user = UserDefaults(suiteName:"User")

userDefaults senkronizasyonunun kullanımı , ayrıntı bilgileri yinelenen yanıta eklendi.


Mağaza yöntemlerini ne zaman ve nerede aramalısınız? Uygulama kapanmadan hemen önce mi yoksa değerler her değiştiğinde mi?
josef

oldukça harika, her türlü işlem için tek bir yer.
michaeln peterson

@ Anbu.Karthik userdefaults'da bir anahtarın değerini nasıl güncelleyeceksiniz?
sathya chinnasamy

2
@RajeshBaidya - userdefault her zaman yalnızca son değeri saklar
Anbu.Karthik

Bu veriler uygulama yükleme / kaldırma sırasında var mı?
OrangePot

40

UserDefaults'u kullanmanın en iyi yolu

adımlar

  1. UserDefaults uzantısını oluşturun
  2. Yerel olarak depolamak için gerekli Anahtarlarla enum oluşturun
  3. Yerel verileri istediğiniz yerde depolayın ve alın

Örneklem

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

Veri depolamak için kullanılan Anahtarlar için numaralandırma

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

İstediğiniz yerde UserDefaults'a kaydedin

UserDefaults.standard.setLoggedIn(value: true)          // String
UserDefaults.standard.setUserID(value: result.User.id!) // String

Uygulamanın herhangi bir yerinde verileri alın

print("ID : \(UserDefaults.standard.getUserID())")
UserDefaults.standard.getUserID()

Değerleri Kaldır

UserDefaults.standard.removeObject(forKey: UserDefaultsKeys.userID) 

Bu şekilde ilkel verileri en iyi şekilde saklayabilirsiniz.

Güncelle Değerleri saklamak için senkronizasyon () kullanmanıza gerek yoktur. @ Moritz'in gereksiz olduğunu belirttiği ve konuyla ilgili yazıya verdiği gibi, daha fazla detay için yorumları kontrol edin.


İhtiyacınız yok synchronize(), belgelerde açıklanmıştır. Burada sadece faydasız değil, aynı zamanda varsayılan erişimi yavaşlatabilir.
Eric Aya

Evet, belgede bahsediliyor. Varsayılan veriler değiştirildikten sonra otomatik olarak kaydedilir, ancak bazı durumlarda değerleriniz saklanmayabilir, yani eşzamansız olabilir. Bu yüzden senkronize etmenin daha iyi olacağını düşündüm.
iSrinivasan27

2
Daha iyi değil - bazen sorunların kaynağı bile oluyor. Senkronizasyon kullanmayın, modası geçmiş ve sorunludur. Bkz codingexplorer.com/nsuserdefaults-a-swift-introduction özellikle "güncelleme" bölümünü. Ayrıca bununla ilgili birçok test yaptım ve tüm uygulamalarımda senkronize edilecek tüm çağrıları kaldırdım ve zorlu durumlarda bile hiçbir sorun yaşamadım. Ama hey, uygulamanızı yavaşlatabilecek gereksiz şeyleri seviyorsanız, senkronizasyonu arayın ... elbette ...;)
Eric Aya

Gerçekten yardımcı oluyor. Sync () için yorum yaptım. Sync () kullanmak ihtiyaca bağlıdır.
iSrinivasan27

hii nsuser varsayılanlarındaki verileri ayrı bir dosyaya hızlı bir şekilde kaydetme
Dilip Tiwari

15

Swift 4 :

mağaza

    UserDefaults.standard.set(object/value, forKey: "key_name")

Retrive

    var returnValue: [datatype]? = UserDefaults.standard.object(forKey: "key_name") as? [datatype]

Kaldırmak

    UserDefaults.standard.removeObject(forKey:"key_name") 

İsteğe bağlı olarak bu satır 'UserDefaults.standard.synchronize ()' ile ne demek istiyorsunuz? @NikunjJoshi
Nishad Arora

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

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

Swift 3'te: dakika = UserDefaults.standard.object (forKey: "dakika") as! String
Alessandro Mattiuzzi

2

NSUserDefaultsBu şekilde hızlıca kullanabilirsiniz ,

@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
Bu gönderinin ilk sürümü, bir dizi değişiklik yaptıktan sonra öğelerinizin kaydedildiğinden emin olmak için synchronize()komutunu kullanacağını söyledi NSUserDefaults. Bu, iOS 7 ve önceki sürümlerde daha gerekli olabilirdi, ancak iOS 8 ve sonraki sürümlerde çoğu durumda senkronizasyon () öğesini çağırmamalısınız. Daha fazla bilgi için bunu kontrol edin: codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

2

Swift 5 ve üzeri:

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

Normalde NSDictionary kaydettim ve doğru şekilde alabildim.

 dictForaddress = placemark.addressDictionary! as NSDictionary
        let userDefaults = UserDefaults.standard
        userDefaults.set(dictForaddress, forKey:Constants.kAddressOfUser)

// NSDictionary'den veri almak için.

let userDefaults = UserDefaults.standard
    let dictAddress = userDefaults.object(forKey: Constants.kAddressOfUser) as! NSDictionary

Yardımınız için teşekkürler bayan. :)
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)
 }
}

Kullanımı:

Değerden Tasarruf Edin:

UserDefaultHelper.userloginId = data["user_id"] as? String

Değeri Getir:

let userloginid = UserDefaultHelper.userloginId

Değeri Sil:

UserDefaultHelper.deleteUserLoginId()

1

Anbu'nun cevabını söyleyebilirim mükemmel ancak programımın başarısız olmaması için tercihleri ​​getirirken koruma eklemek zorunda kaldım

İşte Swift 5'teki güncellenmiş kod parçacığı

Verileri UserDefaults'da saklama

@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

    }

UserDefaults'dan veri alınıyor

    @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

Sınıfta A, anahtar için değer belirleyin:

let text = "hai"  
UserDefaults.standard.setValue(text, forKey: "textValue")

Sınıfta B, sınıfta belirtilen anahtarı kullanarak metnin değerini alın ve Aihtiyacınız olan ilgili değişkene atayın:

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

0

Swift 4, UserDefaults'u işlemek için Enum kullandım.

Bu sadece örnek bir koddur. Gereksinimlerinize göre özelleştirebilirsiniz.

Saklama, Geri Alma, Çıkarma için. Bu şekilde, UserDefaults anahtarınız için enum'a bir anahtar ekleyin. DataType ve gereksinimlerinize göre değerleri alırken ve saklarken kullanın.

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

Kullanıcı varsayılanlarında bir değer depolamak için,

if let authToken = resp.data?.token {
     UserDefaultsConstant.AuthToken.setValue(value: authToken)
    }

Kullanıcı varsayılanlarından bir değer almak için,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.