NSUserDefaults là gì?

NSUserDefault là một class cung cấp một giải pháp để lưu trữ dữ liệu một cách đơn giản. Dữ liệu sau khi được lưu thì kể cả reset thiết bị nó cũng vẫn được lưu lại. Có thể sử dụng NSUserDefaults để lưu trữ các kiểu dữ liệu cơ bản như: Bool, Float, Double, Int, String hoặc NSURL, arrays, dictionaries, NSData, NSData.

Lưu dữ liệu vào NSUserDefaults

Dĩ nhiên việc đầu tiên chúng ta cần là tạo một biến instance của NSUserDefault như sau:

let defaults = UserDefaults.standard

Sau khi tạo thì có thể thêm giá trị như sau, các bạn chú ý nó có 2 tham số là value, key:

defaults.set(25, forKey: "Age")

Đây là cách đơn giản để có thể lưu giá trị vào key nhưng swift cũng cung cấp một số các sự lựa chọn khác như sau:

    open func set(_ value: Int, forKey defaultName: String)

    open func set(_ value: Float, forKey defaultName: String)

    open func set(_ value: Double, forKey defaultName: String)

    open func set(_ value: Bool, forKey defaultName: String)

    open func set(_ url: URL?, forKey defaultName: String)

Như đã nói ở trên, NSUserDefaults có thể lưu một số loại dữ liệu phức tạp hơn như Arrays vả Dictionaries.Để lưu một Array hoặc Dictionaries vào NSUserDefaults cần sử dụng setObject():

defaults.set ("iOS-Blog", forKey: "Name")

defaults.set (NSDate(), forKey: "Date")



let dict = ["Name": "iOS-Blog", "tagline": "Awesome Tutorials", "rating": "10/10"]

defaults.set(dict, forKey: "SavedDict")

Đọc dữ liệu từ NSUserDefaults

Ở phần này phải cẩn thận vì chúng ta sẽ phải cần xác định dữ liệu chính xác khi lấy ra là gì những methods có thể sử dụng:

open func string(forKey defaultName: String) -> String?

open func array(forKey defaultName: String) -> [Any]?

open func dictionary(forKey defaultName: String) -> [String : Any]?

open func data(forKey defaultName: String) -> Data?

open func stringArray(forKey defaultName: String) -> [String]?

open func integer(forKey defaultName: String) -> Int

open func float(forKey defaultName: String) -> Float

open func double(forKey defaultName: String) -> Double

open func bool(forKey defaultName: String) -> Boolfunc dictionaryForKey(defaultName: String) -> [NSObject : AnyObject]?

Vậy tạo sao phải sử dụng đúng phương thức để lấy ra dữ liệu, giá sử khi gọi boolForKey() nó trả về false thì có nghĩa là key đó không tồn tại hoặc đơn giản giá trị của nó là false.

Điều này cũng có nghĩa là với method objectForKey() nó sẽ gặp một số vấn đề bởi kết quả trả về có thể nill vậy nó sẽ là một đối tượng optional. Vậy khi sử dụng bạn cần sử dụng từ khoá as để ép kiểu.

Cần chú ý là nếu sử dụng as/as!  Mà nó trả về nil thì app sẽ bị crash.Nêu trong trường hợp này bạn có thể sử dụng ??(nil coalescing operator) nếu biến trả về có giá trị thì nó sẽ unwrap sử dụng kiểu bên trái, còn nếu nil thì nó sẽ thực hiện vế bên phải:

let array_get = defaults.object (forKey: "SavedArray") as? [String] ?? [String]()

Nếu saveArray tồn tại trong NSUserDefaults thì nó sẽ trả về mảng string, nếu nó không tồn tại thì biến array_get sẽ được gán giá trị một mảng [string] mới. Với dictionary thì cũng tương tự:

let dict = defaults.object(forKey: "SavedDict") as? [String: String] ?? [String: String]()

Hoặc trong trường hợp này có thể dụng phương thức stringArray:

let array_get = defaults. stringArray (forKey: "SavedArray")

Xoá một key trong NSUserDefault

Nếu bạn muốn xoá giá trị từ một đối tượng trong NSUserDefaults, bạn cần gọi đến phương thức removeObjectForKey:

defaults.removeObject(forKey: "SavedDict")

Tóm lại:

Trong bài này chúng ta đã biết cách thêm, đọc, xoá dữ liệu với NSUserDefaults