ฉันจะใช้ UserDefaults เพื่อบันทึก / ดึงสตริงบูลีนและข้อมูลอื่น ๆ ใน Swift ได้อย่างไร
ฉันจะใช้ UserDefaults เพื่อบันทึก / ดึงสตริงบูลีนและข้อมูลอื่น ๆ ใน Swift ได้อย่างไร
คำตอบ:
อ้างอิง: NSUserdefault objectTypes
เก็บ
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)
}
เก็บ
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 รวมกลุ่มแยกกัน) โดยใช้ตัวระบุเช่นเดียวกับ SharedPreferences ของ Android ตัวอย่างเช่นเมื่อผู้ใช้ในแอปของฉันคลิกที่ปุ่มออกจากระบบฉันต้องการล้างค่าเริ่มต้นที่เกี่ยวข้องกับบัญชีของเขา แต่ไม่ใช่ตำแหน่งของอุปกรณ์
let user = UserDefaults(suiteName:"User")
การใช้ userDefaults ซิงโครไนซ์ข้อมูลรายละเอียดได้เพิ่มในคำตอบที่ซ้ำกัน
วิธีที่ดีที่สุดในการใช้UserDefaults
ขั้นตอน
ตัวอย่าง
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()
มีอธิบายไว้ในเอกสาร ที่นี่ไม่เพียง แต่ไร้ประโยชน์ แต่อาจทำให้การเข้าถึงค่าเริ่มต้นช้าลง
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")
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")
//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
คุณสามารถใช้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
}
synchronize()
คำสั่งNSUserDefaults
เพื่อให้แน่ใจว่าข้อมูลของคุณได้รับการบันทึกหลังจากทำการเปลี่ยนแปลงบล็อก สิ่งนี้อาจจำเป็นกว่าใน iOS 7 และรุ่นก่อนหน้าแต่ใน iOS 8 ขึ้นไปคุณไม่ควรเรียกซิงโครไนซ์ () ในสถานการณ์ส่วนใหญ่ ตรวจสอบข้อมูลเพิ่มเติมได้ที่: codingexplorer.com/nsuserdefaults-a-swift-introduction
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]()
:)
ฉันบันทึก 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
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)
}
}
การใช้งาน:
ประหยัดค่า:
UserDefaultHelper.userloginId = data["user_id"] as? String
ดึงค่า:
let userloginid = UserDefaultHelper.userloginId
ลบค่า:
UserDefaultHelper.deleteUserLoginId()
ฉันจะบอกว่าคำตอบของ 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"))
}
ในชั้นเรียนA
ตั้งค่าสำหรับคีย์:
let text = "hai"
UserDefaults.standard.setValue(text, forKey: "textValue")
ในชั้นเรียนB
รับค่าสำหรับข้อความโดยใช้คีย์ที่ประกาศในชั้นเรียนA
และกำหนดให้กับตัวแปรตามที่คุณต้องการ:
var valueOfText = UserDefaults.value(forKey: "textValue")
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)