web-dev-qa-db-ja.com

SwiftでUserDefaultsを使用する方法

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

87

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

UserDefaultsスイート名

もう1つのプロパティ スイート名 、ほとんどが アプリケーショングループの概念 、シナリオ例I こちら からの引用:

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

let user = UserDefaults(suiteName:"User")

userDefaultsの使用同期 、詳細情報が重複する回答に追加されました。

262
Anbu.Karthik

最良の使用方法serDefaults

ステップ

  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データの保存に使用されるキーの場合

enum UserDefaultsKeys : String {
    case isLoggedIn
    case userID
}

serDefaultsに保存あなたが望むところ

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()を使う必要はありません。 @Moritzがそれを不要と指摘し、それについての記事を書いたように。詳細についてはコメントをチェックする

24
iSrinivasan27

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") 
11
Nikunj Joshi

このようにSwiftで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
DHEERAJ

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
Xab Ion

私は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
Chandni
//Save
NSUserDefaults.standardUserDefaults().setObject("yourString", forKey: "YourStringKey")

//retrive
let yourStr : AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey("YourStringKey")
1
Dharmesh
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)
            }
        }
    }
}
0
neoneye

私は言うでしょう Anbu's answer 完璧に結構ですが、プリファレンスを取得しながらプログラムを失敗させないためにガードを追加する必要がありました

これはSwift 5に更新されたコードの断片です。

設定にデータを保存する

@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

    }

設定からデータを取得する

    @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
swiftBoy

クラスAで、keyに値を設定します。

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

クラスBで、クラスAで宣言したキーを使用してテキストの値を取得し、それを必要なそれぞれの変数に割り当てます。

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