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?
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?
Câu trả lời:
ref: NSUserdefault objectTypes
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)
}
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")
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
}
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.
Cách tốt nhất để sử dụng UserDefaults
Các bước
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
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.
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")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
Bạn có thể sử dụng NSUserDefaults
nhanh 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
}
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
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]()
:)
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
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)
}
}
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()
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"))
}
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 A
và gán nó cho biến tương ứng mà bạn cần:
var valueOfText = UserDefaults.value(forKey: "textValue")
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)