Swift'de dizeleri, boole'leri ve diğer verileri kaydetmek / almak için UserDefaults'u nasıl kullanabilirim?
Swift'de dizeleri, boole'leri ve diğer verileri kaydetmek / almak için UserDefaults'u nasıl kullanabilirim?
Yanıtlar:
ref: NSUserdefault objectTypes
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)
}
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")
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
}
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.
UserDefaults'u kullanmanın en iyi yolu
adımlar
Ö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.
synchronize()
, belgelerde açıklanmıştır. Burada sadece faydasız değil, aynı zamanda varsayılan erişimi yavaşlatabilir.
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")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
NSUserDefaults
Bu ş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
}
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
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]()
:)
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
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)
}
}
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()
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"))
}
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 A
ihtiyacınız olan ilgili değişkene atayın:
var valueOfText = UserDefaults.value(forKey: "textValue")
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)