Androidの共有設定に相当するiOS


105

私はAndroidアプリをiOSに移植しています。私が使用したのは、レベルが完了するたびに保存するAndroidの共有設定です。

そうすることで、ユーザーがアプリに戻ったときに、レベル3などに達していることがわかります。

iOSにも同様のメカニズムはありますか?または、アプリケーション固有のファイルに手動で書き出す必要がありますか?

もしそうなら、どのように私は自分のアプリケーションにのみ見えるファイルに書き出すのですか?

ありがとう。


1
iOSでこれに最も近いのはNSUserDefaultsだと思います。そして、ここに保存して取得する方法の簡単な例です。
Tarek Hallak 2013年

回答:


203

NSUserDefaultsを使用しますこれは、前述のように現在のレベルなど、データの小さなビット用であることに注意してください。これを乱用しないでください。大きなデータベースとして使用してください。アプリから何かが必要かどうかにかかわらず、アプリを開くたびにメモリに読み込まれます(アプリの他の部分でもこれを使用します)。

Objective-C:

読書:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

書き込み:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

迅速:

読書:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

書き込み:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

条件付きバインディングを使用して、迅速なif let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel} で読み取ることもできます
Raghu Teja

4
機能しない@chittiいいえ、integerForKeyはオプションを返しません
SomeGuy

40

こちらがSwift 3のアップデートです

読書

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

書き込み

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

更新

UserDefaultsドキュメントから

synchronize()デフォルトのデータベースに対する保留中の非同期更新を待機して戻ります。このメソッドは不要になり、使用すべきではありません。


2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")

-1

前の回答のとおり、これUserDefaultsはiosの共有設定と同等です。共通の書き込み関数を作成し、データ型に基づいて読み取り作成関数を作成できます。そして、どこからでも必要なメソッドを呼び出します。

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.