SwiftでUserDefaultsを使用するにはどうすればよいですか?


119

UserDefaultsを使用して、文字列、ブール値、その他のデータをSwiftに保存/取得するにはどうすればよいですか?


4
このトピックに関する一般的な質問として役立つので、この質問を再開します。受け入れられた回答は、以前にマークされた重複よりも明確であり、この質問よりも具体的でした。
Suragch 2017年


この質問はスタックオーバーフローで利用できると思います。質問を追加する前に検索する必要があります
Yogesh Patel

回答:


329

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が他のすべての有効な場所で値を検索した後、登録されたデフォルトを検索し、「フォールバック」値として役立つことを意味します。登録されたデフォルトは、アプリケーションの実行間で保存されることはなく、それらを登録するアプリケーションにのみ表示されます。

デフォルト設定ファイルのデフォルト値が自動的に登録されます。

たとえば、起動からアプリを検出し、起動を保存するための構造体を作成します

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スイート名

別の1つのプロパティスイート名。主にApp Groupsの概念に使用 されますここから私が取ったシナリオ例:

ユースケースは、AndroidのSharedPreferencesと同じように、UserDefaults(別のビジネスロジックではUserdefaultsを個別にグループ化する必要がある場合があります)を識別子で区切りたい場合です。たとえば、アプリのユーザーがログアウトボタンをクリックしたときに、デバイスの場所ではなく、アカウント関連のデフォルトをクリアしたいとします。

let user = UserDefaults(suiteName:"User")

userDefaults synchronizeを使用すると、詳細情報が重複する回答に追加されます。


いつどこでstoreメソッドを呼び出す必要がありますか?アプリが閉じる直前、または値が変わるたびに?
ジョセフ2017

かなり素晴らしいです。あらゆる種類の操作を1か所で行えます。
マイケルピーターソン2017

@ Anbu.Karthik userdefaultsのキーの値をどのように更新しますか?
sathya chinnasamy 2017年

2
@RajeshBaidya-userdefaultは常に最終値のみを保存します
Anbu.Karthik 2018年

このデータはアプリのインストール/アンインストール後も保持されますか?
OrangePot 2018

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) 

このようにして、プリミティブデータを最適に保存できます。

更新 値を保存するためにsynchronize()を使用する必要はありません。@モリッツがそれを不必要に指摘し、それについての記事を与えたように。


必要ありませんsynchronize()。ドキュメントで説明されています。ここでは役に立たないだけでなく、デフォルトのアクセスが遅くなる可能性があります。
Eric Aya、

はい、ドキュメントに記載されています。デフォルトのデータが変更されると自動的に保存されますが、値が非同期に保存されない場合があります。だから私は同期する方が良いと思いました。
iSrinivasan27

2
それは良くない-それは時々問題の原因です。同期は使用しないでください。これは時代遅れで問題があります。特に「更新」部分は、codingexplorer.com / nsuserdefaults-a-swift-introductionを参照してください。私はこれについても多くのテストを実行し、すべてのアプリで同期するためのすべての呼び出しを削除しました。しかし、ねえ、あなたのアプリを遅くすることができる役に立たないものが好きなら、同期を呼んでください...確かに...;)
Eric Aya

それは本当に役に立ちます。sync()にコメントしました。sync()の使用は必要に応じて行われます。
iSrinivasan27

hii nsuserdefaultsのデータを別のファイルに迅速に保存する方法
Dilip Tiwari

15

Swift 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 Arora


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以降では、ほとんどの状況でsynchronize()を呼び出さないでください。 詳細については、これを確認してください:codingexplorer.com/nsuserdefaults-a-swift-introduction
Dharmesh 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

あなたの助けを逃してくれてありがとう。:)
ベンカテッシュ

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

クラスでB、クラスで宣言したキーを使用してテキストの値を取得し、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.