UserDefaults를 사용하여 Swift에서 문자열, 부울 및 기타 데이터를 저장 / 검색하려면 어떻게해야합니까?
UserDefaults를 사용하여 Swift에서 문자열, 부울 및 기타 데이터를 저장 / 검색하려면 어떻게해야합니까?
답변:
ref : 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 : 모든 검색 목록의 마지막 항목에 registrationDictionary를 추가합니다. 즉, NSUserDefaults가 다른 모든 유효한 위치에서 값을 찾은 후에 등록 된 기본값을 검색하여 "대체"값으로 유용하게 만듭니다. 등록 된 기본값은 응용 프로그램 실행 사이에 저장되지 않으며이를 등록하는 응용 프로그램에만 표시됩니다.
기본값 구성 파일의 기본값이 자동으로 등록됩니다.
예를 들어 launch에서 앱을 감지하고 저장 시작을위한 구조체를 만듭니다.
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
}
다른 하나의 속성 모음 이름 은 주로 앱 그룹 개념에 사용 되며 여기 에서 가져온 예제 시나리오입니다 .
사용 사례는 Android의 SharedPreferences와 같은 식별자로 UserDefaults (다른 비즈니스 로직에 따라 Userdefaults를 별도로 그룹화해야 할 수 있음)를 구분하려는 것입니다. 예를 들어 내 앱의 사용자가 로그 아웃 버튼을 클릭 할 때 기기 위치가 아닌 계정 관련 기본값을 지우고 싶습니다.
let user = UserDefaults(suiteName:"User")
userDefaults sync 사용 하면 중복 답변에 세부 정보가 추가되었습니다.
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 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()
. 문서에 설명되어 있습니다. 여기서는 쓸모가 없을뿐만 아니라 기본 액세스 속도가 느려질 수 있습니다.
스위프트 4 :
저장
UserDefaults.standard.set(object/value, forKey: "key_name")
검색
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")
class B
에서 class에서 선언 한 키를 사용하여 텍스트 값을 가져와 A
필요한 각 변수에 할당합니다.
var valueOfText = UserDefaults.value(forKey: "textValue")
Swift 4, UserDefaults를 처리하기 위해 Enum을 사용했습니다.
이것은 단지 샘플 코드입니다. 요구 사항에 따라 사용자 정의 할 수 있습니다.
저장, 검색, 제거 용. 이런 식으로 UserDefaults 키에 대한 키를 열거 형에 추가하십시오. 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()
}
}
userdefaults에 값을 저장하려면
if let authToken = resp.data?.token {
UserDefaultsConstant.AuthToken.setValue(value: authToken)
}
userdefaults에서 값을 검색하려면
//As AuthToken value is a string
(UserDefaultsConstant.AuthToken.getValue() as! String)