ฉันจะใช้ UserDefaults ใน Swift ได้อย่างไร


119

ฉันจะใช้ UserDefaults เพื่อบันทึก / ดึงสตริงบูลีนและข้อมูลอื่น ๆ ใน Swift ได้อย่างไร


4
ฉันกำลังเปิดคำถามนี้อีกครั้งเนื่องจากสามารถตอบคำถามทั่วไปในหัวข้อนี้ได้ คำตอบที่ได้รับการยอมรับนั้นชัดเจนกว่าคำถามที่ทำเครื่องหมายไว้ก่อนหน้านี้ซึ่งมีความเฉพาะเจาะจงมากกว่าคำถามนี้เช่นกัน
Suragch


ฉันคิดว่าคำถามนี้มีอยู่ใน stack overflow คุณควรค้นหาก่อนเพิ่มคำถามที่นี่
Yogesh Patel

คำตอบ:


331

อ้างอิง: NSUserdefault objectTypes

Swift 3 ขึ้นไป

เก็บ

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

กู้

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

ลบ

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

ลบคีย์ทั้งหมด

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

Swift 2 และต่ำกว่า

เก็บ

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

กู้

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

ลบ

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


สมัครสมาชิก

registerDefaults: เพิ่ม registerDictionary ไปยังรายการสุดท้ายในทุกรายการค้นหา ซึ่งหมายความว่าหลังจาก NSUserDefaults ได้ค้นหาค่าในทุกตำแหน่งที่ถูกต้องแล้วค่านั้นจะดูค่าเริ่มต้นที่ลงทะเบียนไว้ทำให้มีประโยชน์ในฐานะ "ทางเลือก" ค่าเริ่มต้นที่ลงทะเบียนจะไม่ถูกจัดเก็บระหว่างการรันแอปพลิเคชันและจะมองเห็นได้เฉพาะแอปพลิเคชันที่ลงทะเบียนเท่านั้น

ค่าเริ่มต้นจาก Defaults Configuration Files จะถูกลงทะเบียนโดยอัตโนมัติ

ตัวอย่างเช่นตรวจจับแอปจากการเปิดตัวสร้างโครงสร้างสำหรับบันทึกการเปิดตัว

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

ลงทะเบียนค่าเริ่มต้นเมื่อเปิดแอป:

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

ลบค่าในการยุติแอป:

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

}

และตรวจสอบเงื่อนไขเป็น

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

ชื่อชุด UserDefaults

ชื่อชุดคุณสมบัติอีกชื่อหนึ่งซึ่งส่วนใหญ่ใช้สำหรับ แนวคิดกลุ่มแอปสถานการณ์ตัวอย่างที่ฉันนำมาจากที่นี่ :

กรณีการใช้งานคือฉันต้องการแยก UserDefaults ของฉัน (ตรรกะทางธุรกิจที่แตกต่างกันอาจต้องใช้ Userdefaults รวมกลุ่มแยกกัน) โดยใช้ตัวระบุเช่นเดียวกับ SharedPreferences ของ Android ตัวอย่างเช่นเมื่อผู้ใช้ในแอปของฉันคลิกที่ปุ่มออกจากระบบฉันต้องการล้างค่าเริ่มต้นที่เกี่ยวข้องกับบัญชีของเขา แต่ไม่ใช่ตำแหน่งของอุปกรณ์

let user = UserDefaults(suiteName:"User")

การใช้ userDefaults ซิงโครไนซ์ข้อมูลรายละเอียดได้เพิ่มในคำตอบที่ซ้ำกัน


คุณควรโทรหาวิธีการจัดเก็บเมื่อใดและที่ไหน? ก่อนปิดแอพหรือทุกครั้งที่ค่าเปลี่ยน?
josef

สวยมากที่เดียวสำหรับการใช้งานทุกประเภท
michaeln peterson

@ Anbu.Karthik คุณจะอัปเดตค่าของคีย์ใน userdefaults ได้อย่างไร
sathya chinnasamy

2
@RajeshBaidya - userdefault เก็บค่าสุดท้ายเท่านั้น
Anbu.Karthik

ข้อมูลนี้ยังคงอยู่ผ่านการติดตั้ง / ถอนการติดตั้งแอปหรือไม่
OrangePot

40

วิธีที่ดีที่สุดในการใช้UserDefaults

ขั้นตอน

  1. สร้างส่วนขยายของ UserDefaults
  2. สร้าง enum ด้วยคีย์ที่จำเป็นเพื่อจัดเก็บในท้องถิ่น
  3. จัดเก็บและดึงข้อมูลในเครื่องทุกที่ที่คุณต้องการ

ตัวอย่าง

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สำหรับคีย์ที่ใช้ในการจัดเก็บข้อมูล

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

บันทึกใน UserDefaultsที่คุณต้องการ

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

ดึงข้อมูลได้ทุกที่ในแอป

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

ลบค่า

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

วิธีนี้ช่วยให้คุณสามารถจัดเก็บข้อมูลดั้งเดิมได้ดีที่สุด

อัปเดต คุณไม่จำเป็นต้องใช้ซิงโครไนซ์ () เพื่อจัดเก็บค่า เนื่องจาก @Moritz ชี้ให้เห็นว่ามันไม่จำเป็นและให้บทความเกี่ยวกับเรื่องนี้ตรวจสอบความคิดเห็นเพื่อดูรายละเอียดเพิ่มเติม


คุณไม่จำเป็นต้องsynchronize()มีอธิบายไว้ในเอกสาร ที่นี่ไม่เพียง แต่ไร้ประโยชน์ แต่อาจทำให้การเข้าถึงค่าเริ่มต้นช้าลง
Eric Aya

ใช่มีการกล่าวถึงในเอกสาร เมื่อข้อมูลเริ่มต้นมีการเปลี่ยนแปลงข้อมูลจะถูกบันทึกโดยอัตโนมัติ แต่ในบางกรณีค่าของคุณอาจไม่จัดเก็บเช่นอะซิงโครนัส ดังนั้นฉันคิดว่ามันดีกว่าที่จะซิงค์
iSrinivasan27

2
มันไม่ดีกว่า - บางครั้งมันก็เป็นที่มาของปัญหา อย่าใช้การซิงค์มันล้าสมัยและมีปัญหา โปรดดูcodingexplorer.com/nsuserdefaults-a-swift- บทนำโดยเฉพาะส่วน "อัปเดต" ฉันยังทำการทดสอบหลายครั้งเกี่ยวกับเรื่องนี้และลบการโทรทั้งหมดเพื่อซิงค์ในแอพทั้งหมดของฉันและไม่เคยมีปัญหาแม้แต่ในสถานการณ์ที่เลวร้าย แต่เดี๋ยวก่อนถ้าคุณชอบสิ่งไร้ประโยชน์ที่ทำให้แอปของคุณช้าลงโทรซิงก์ ... แน่ ... ;)
Eric Aya

เป็นประโยชน์จริงๆ ฉันได้แสดงความคิดเห็นเกี่ยวกับการซิงค์ () การใช้ sync () ขึ้นอยู่กับความจำเป็น
iSrinivasan27

hii วิธีบันทึกข้อมูลใน nsuserdefaults ในไฟล์แยกใน swift
Dilip Tiwari

15

Swift 4 :

เก็บ

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

retrive

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

ลบ

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

คุณหมายถึงอะไรโดยบรรทัดนี้ 'UserDefaults.standard.synchronize ()' เป็นทางเลือก? @NikunjJoshi
Nishad Arora

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

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

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

2

คุณสามารถใช้NSUserDefaultsวิธีนี้ได้อย่างรวดเร็ว

@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
เวอร์ชันแรกของโพสต์นี้กล่าวว่าจะใช้synchronize()คำสั่งNSUserDefaultsเพื่อให้แน่ใจว่าข้อมูลของคุณได้รับการบันทึกหลังจากทำการเปลี่ยนแปลงบล็อก สิ่งนี้อาจจำเป็นกว่าใน iOS 7 และรุ่นก่อนหน้าแต่ใน iOS 8 ขึ้นไปคุณไม่ควรเรียกซิงโครไนซ์ () ในสถานการณ์ส่วนใหญ่ ตรวจสอบข้อมูลเพิ่มเติมได้ที่: codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

2

Swift 5 ขึ้นไป:

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

ฉันบันทึก NSDictionary ตามปกติและสามารถรับได้อย่างถูกต้อง

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

// สำหรับการรับข้อมูลจาก NSDictionary

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

ขอบคุณสำหรับความช่วยเหลือของคุณพลาด :)
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)
 }
}

การใช้งาน:

ประหยัดค่า:

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

ดึงค่า:

let userloginid = UserDefaultHelper.userloginId

ลบค่า:

UserDefaultHelper.deleteUserLoginId()

1

ฉันจะบอกว่าคำตอบของ Anbu นั้นดีมาก แต่ฉันต้องเพิ่มยามในขณะที่เรียกค่ากำหนดเพื่อให้โปรแกรมของฉันไม่ล้มเหลว

นี่คือสนิปโค้ดที่อัปเดตในSwift 5

การจัดเก็บข้อมูลใน 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

    }

กำลังดึงข้อมูลจาก 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

ในชั้นเรียนAตั้งค่าสำหรับคีย์:

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

ในชั้นเรียนBรับค่าสำหรับข้อความโดยใช้คีย์ที่ประกาศในชั้นเรียนAและกำหนดให้กับตัวแปรตามที่คุณต้องการ:

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

0

Swift 4 ฉันใช้ Enum เพื่อจัดการ UserDefaults

นี่เป็นเพียงตัวอย่างโค้ด คุณสามารถปรับแต่งได้ตามความต้องการของคุณ

สำหรับการจัดเก็บการเรียกค้นการลบ ด้วยวิธีนี้เพียงแค่เพิ่มคีย์สำหรับคีย์ UserDefaults ของคุณลงใน enum จัดการค่าในขณะรับและจัดเก็บตาม dataType และความต้องการของคุณ

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

สำหรับการจัดเก็บค่าในค่าเริ่มต้นของผู้ใช้

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

สำหรับการดึงค่าจาก userdefaults

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.