Làm cách nào để sử dụng UserDefaults trong Swift?


119

Làm cách nào để sử dụng UserDefaults để lưu / truy xuất chuỗi, boolean và các dữ liệu khác trong Swift?


4
Tôi đang mở lại câu hỏi này vì nó có thể trở thành một câu hỏi chung tốt về chủ đề này. Câu trả lời được chấp nhận cũng rõ ràng hơn so với bản sao được đánh dấu trước đó , cũng cụ thể hơn câu hỏi này.
Suragch


Tôi nghĩ rằng câu hỏi này có sẵn trong phần tràn ngăn xếp, bạn nên tìm kiếm trước khi thêm câu hỏi ở đây
Yogesh Patel

Câu trả lời:


330

ref: NSUserdefault objectTypes

Swift 3 trở lên

Cửa hàng

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

Lấy lại

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

Tẩy

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

Xóa tất cả các phím

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

Swift 2 trở xuống

Cửa hàng

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

Lấy lại

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

Tẩy

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


Đăng ký

registerDefaults: thêm registerDictionary vào mục cuối cùng trong mọi danh sách tìm kiếm. Điều này có nghĩa là sau khi NSUserDefaults đã tìm kiếm một giá trị ở mọi vị trí hợp lệ khác, nó sẽ tìm kiếm trong các giá trị mặc định đã đăng ký, làm cho chúng hữu ích như một giá trị "dự phòng". Giá trị mặc định đã đăng ký không bao giờ được lưu trữ giữa các lần chạy ứng dụng và chỉ hiển thị đối với ứng dụng đăng ký chúng.

Giá trị mặc định từ Tệp cấu hình mặc định sẽ tự động được đăng ký.

ví dụ: phát hiện ứng dụng từ khi khởi chạy, tạo cấu trúc để lưu khởi chạy

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

Đăng ký các giá trị mặc định khi khởi chạy ứng dụng:

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

xóa giá trị khi chấm dứt ứng dụng:

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

}

và kiểm tra điều kiện như

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

Tên bộ UserDefaults

một tên bộ thuộc tính khác , chủ yếu được sử dụng cho khái niệm Nhóm ứng dụng , tình huống ví dụ tôi lấy từ đây :

Trường hợp sử dụng là tôi muốn tách UserDefaults của mình (logic nghiệp vụ khác nhau có thể yêu cầu Userdefaults được nhóm riêng) bằng một mã định danh giống như SharedPreferences của Android. Ví dụ: khi một người dùng trong ứng dụng của tôi nhấp vào nút đăng xuất, tôi muốn xóa các giá trị mặc định liên quan đến tài khoản của họ nhưng không xóa vị trí của thiết bị.

let user = UserDefaults(suiteName:"User")

sử dụng đồng bộ hóa userDefaults , thông tin chi tiết đã được thêm vào câu trả lời trùng lặp.


Khi nào và ở đâu bạn nên gọi các phương thức cửa hàng? Ngay trước khi ứng dụng đóng hoặc mỗi khi các giá trị thay đổi?
josef

khá tuyệt vời, một nơi cho tất cả các loại hoạt động.
michaeln peterson

@ Anbu.Karthik bạn sẽ cập nhật giá trị cho một khóa trong mặc định của người dùng như thế nào?
Sathya chinnasamy

2
@RajeshBaidya - userdefault luôn lưu trữ các giá trị cuối cùng chỉ
Anbu.Karthik

Dữ liệu này có tồn tại trong quá trình cài đặt / gỡ cài đặt ứng dụng không?
OrangePot

40

Cách tốt nhất để sử dụng UserDefaults

Các bước

  1. Tạo phần mở rộng của UserDefaults
  2. Tạo enum với các Khóa bắt buộc để lưu trữ trong cục bộ
  3. Lưu trữ và truy xuất dữ liệu cục bộ ở bất cứ đâu bạn muốn

Mẫu vật

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 for Keys dùng để lưu trữ dữ liệu

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

Lưu trong UserDefaults ở nơi bạn muốn

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

Truy xuất dữ liệu ở mọi nơi trong ứng dụng

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

Xóa giá trị

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

Bằng cách này, bạn có thể lưu trữ dữ liệu nguyên thủy một cách tốt nhất

Cập nhật Bạn không cần sử dụng đồng bộ hóa () để lưu trữ các giá trị. Như @Moritz đã chỉ ra điều đó không cần thiết và đưa ra bài viết về nó. Kiểm tra nhận xét để biết thêm chi tiết


Bạn không cần synchronize(), nó được giải thích trong tài liệu. Nó không chỉ vô dụng ở đây mà còn có thể làm chậm quá trình truy cập mặc định.
Eric Aya

Có, nó được đề cập trong tài liệu. Khi dữ liệu mặc định được thay đổi, nó sẽ tự động lưu nhưng trong một số trường hợp, các giá trị của bạn có thể không lưu trữ tức là không đồng bộ. Vì vậy, tôi nghĩ tốt hơn là nên đồng bộ hóa.
iSrinivasan27

2
Nó không tốt hơn - thậm chí đôi khi nó là nguồn gốc của các vấn đề. Không sử dụng đồng bộ, nó lỗi thời và có vấn đề. Xem codingexplorer.com/nsuserdefaults-a-swift-introduction đáng chú ý là phần "cập nhật". Tôi cũng đã chạy nhiều thử nghiệm về điều này và xóa tất cả các cuộc gọi để đồng bộ hóa trong tất cả các ứng dụng của mình và không bao giờ gặp sự cố ngay cả trong các tình huống nghiêm trọng. Nhưng này, nếu bạn thích những thứ vô dụng có thể làm chậm ứng dụng của bạn, hãy đồng bộ hóa cuộc gọi ... chắc chắn ...;)
Eric Aya

Nó thực sự hữu ích. Tôi đã nhận xét đồng bộ hóa (). Sử dụng sync () dựa trên mức độ cần thiết.
iSrinivasan27

hii làm thế nào để lưu dữ liệu trong nsuserdefaults trong một file riêng biệt trong nhanh chóng
Dilip Tiwari

15

Swift 4 :

Cửa hàng

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

Retrive

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

Tẩy

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

ý của bạn là gì khi dòng 'UserDefaults.standard.synchronize ()' là tùy chọn? @NikunjJoshi
Nishad Arora

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

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

Trong Swift 3: let minutes = UserDefaults.standard.object (forKey: "minutes") as! Chuỗi
Alessandro Mattiuzzi

2

Bạn có thể sử dụng NSUserDefaultsnhanh chóng theo cách này,

@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
Phiên bản đầu tiên của bài đăng này được cho là sử dụng synchronize()lệnh for NSUserDefaultsđể đảm bảo nội dung của bạn được lưu sau khi thực hiện một loạt các thay đổi. Điều này có thể cần thiết hơn trong iOS 7 trở về trước, nhưng trong iOS 8 trở đi, bạn không nên gọi đồng bộ hóa () trong hầu hết các tình huống. Kiểm tra này để biết thêm thông tin: codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh Kheni

2

Swift 5 trở lên:

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

Tôi đã lưu NSDictionary bình thường và có thể lấy nó một cách chính xác.

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

// Để lấy dữ liệu từ NSDictionary.

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

Cảm ơn sự giúp đỡ của bạn :)
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)
 }
}

Sử dụng:

Tiết kiệm giá trị:

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

Giá trị tìm nạp:

let userloginid = UserDefaultHelper.userloginId

Xóa giá trị:

UserDefaultHelper.deleteUserLoginId()

1

Tôi sẽ nói câu trả lời của Anbu hoàn toàn tốt nhưng tôi phải thêm bảo vệ khi tìm nạp các tùy chọn để làm cho chương trình của tôi không bị lỗi

Đây là đoạn mã cập nhật trong Swift 5

Lưu trữ dữ liệu trong 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

    }

Tìm nạp dữ liệu từ 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

Trong lớp A, hãy đặt giá trị cho khóa:

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

Trong lớp B, lấy giá trị cho văn bản bằng cách sử dụng khóa được khai báo trong lớp Avà gán nó cho biến tương ứng mà bạn cần:

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

0

Swift 4, tôi đã sử dụng Enum để xử lý UserDefaults.

Đây chỉ là một mã mẫu. Bạn có thể tùy chỉnh nó theo yêu cầu của bạn.

Để lưu trữ, truy xuất, loại bỏ. Bằng cách này, chỉ cần thêm một khóa cho khóa UserDefaults của bạn vào enum. Xử lý các giá trị trong khi nhận và lưu trữ theo dataType và yêu cầu của bạ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()
    }
}

Để lưu trữ một giá trị trong mặc định của người dùng,

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

Để truy xuất một giá trị từ mặc định của người dùng,

//As AuthToken value is a string
    (UserDefaultsConstant.AuthToken.getValue() as! String)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.