Swift에서 UserDefaults를 어떻게 사용할 수 있습니까?


119

UserDefaults를 사용하여 Swift에서 문자열, 부울 및 기타 데이터를 저장 / 검색하려면 어떻게해야합니까?


4
나는이 주제에 대한 좋은 일반적인 질문으로 서버가 될 수 있기 때문에이 질문을 다시 열고 있습니다. 허용 된 답변은 이전에 중복으로 표시된 것보다 더 명확 하며이 질문보다 더 구체적입니다.
Suragch 2017


이 질문은 스택 오버플로에서 사용할 수 있다고 생각합니다. 여기에 질문을 추가하기 전에 검색해야합니다
Yogesh Patel

답변:


330

ref : NSUserdefault objectTypes

Swift 3 이상

저장

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)
 }

Swift 2 이하

저장

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
}

UserDefaults 제품군 이름

다른 하나의 속성 모음 이름 은 주로 앱 그룹 개념에 사용 되며 여기 에서 가져온 예제 시나리오입니다 .

사용 사례는 Android의 SharedPreferences와 같은 식별자로 UserDefaults (다른 비즈니스 로직에 따라 Userdefaults를 별도로 그룹화해야 할 수 있음)를 구분하려는 것입니다. 예를 들어 내 앱의 사용자가 로그 아웃 버튼을 클릭 할 때 기기 위치가 아닌 계정 관련 기본값을 지우고 싶습니다.

let user = UserDefaults(suiteName:"User")

userDefaults sync 사용 하면 중복 답변에 세부 정보가 추가되었습니다.


언제 어디서 저장 메소드를 호출해야합니까? 앱이 종료되기 직전 또는 값이 변경 될 때마다?
josef jul.

모든 종류의 작업을위한 하나의 장소입니다.
michaeln peterson

@ Anbu.Karthik userdefaults에서 키 값을 어떻게 업데이트합니까?
sathya chinnasamy

2
@RajeshBaidya는 - userdefault 항상에만 최종 값을 저장
Anbu.Karthik

이 데이터는 앱 설치 / 제거를 통해 유지 되나요?
OrangePot

40

UserDefaults 를 사용하는 가장 좋은 방법

단계

  1. UserDefaults 확장 만들기
  2. 로컬에 저장할 필수 키로 열거 형 만들기
  3. 원하는 곳에서 로컬 데이터 저장 및 검색

견본

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(). 문서에 설명되어 있습니다. 여기서는 쓸모가 없을뿐만 아니라 기본 액세스 속도가 느려질 수 있습니다.
Eric Aya

예, 문서에 언급되어 있습니다. 기본 데이터가 변경되면 자동으로 저장되지만 경우에 따라 값이 비동기 적으로 저장되지 않을 수 있습니다. 그래서 동기화하는 것이 더 좋다고 생각했습니다.
iSrinivasan27

2
낫지 않습니다. 때로는 문제의 원인이기도합니다. 동기화를 사용하지 마십시오. 더 이상 사용되지 않으며 문제가 있습니다. codingexplorer.com/nsuserdefaults-a-swift-introduction 특히 "업데이트"부분을 참조하십시오 . 나는 또한 이것에 대해 많은 테스트를 실행하고 모든 앱에서 동기화를위한 모든 호출을 제거했으며 심각한 상황에서도 문제가 발생하지 않았습니다. )하지만, 이봐, 당신이 쓸모없는 물건을 원한다면 당신의 앱 전화 동기화 ... 확인 ... 느려질 수
에릭 아야

정말 도움이됩니다. sync () 주석을 달았습니다. sync () 사용은 필요에 따라 다릅니다.
iSrinivasan27

HII는 신속한에서 별도의 파일에 nsuserdefaults에 데이터를 저장하는 방법
딜립 Tiwari 보낸 사람에게

15

스위프트 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") 

이 줄 'UserDefaults.standard.synchronize ()'는 선택 사항으로 무엇을 의미합니까? @NikunjJoshi
Nishad 아 로라

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

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

Swift 3 : let minutes = UserDefaults.standard.object (forKey : "minutes") as! 문자열
알레산드로 Mattiuzzi

2

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
}

2
이 게시물의 첫 번째 버전 에서는 변경 사항을 수행 한 후 항목이 저장되었는지 확인하기 위해 synchronize()명령 을 사용한다고 말했습니다 NSUserDefaults. 이는 iOS 7 및 이전 버전에서 더 필요했을 수 있지만 iOS 8 이상에서는 대부분의 상황에서 동기화 ()를 호출하지 않아야합니다. 추가 정보를 원하시면이 옵션을 선택합니다 : codingexplorer.com/nsuserdefaults-a-swift-introduction
다르 메쉬 Kheni

2

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]()

:)


1

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

도와 주셔서 감사합니다. :)
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)
 }
}

용법:

가치 저장 :

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

값 가져 오기 :

let userloginid = UserDefaultHelper.userloginId

값 삭제 :

UserDefaultHelper.deleteUserLoginId()

1

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"))
    }

0

클래스 A에서 키 값을 설정합니다.

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

class B에서 class에서 선언 한 키를 사용하여 텍스트 값을 가져와 A필요한 각 변수에 할당합니다.

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

0

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.