web-dev-qa-db-ja.com

Android共有設定に相当するiOS

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

このようにして、ユーザーがアプリに戻ったときに、レベル3またはそれ以下であることを確認できます。

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

もしそうなら、どうすれば自分のアプリケーションにしか見えないファイルに書き出すことができますか?

ありがとう。

98
FaddishWorm

使用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)
}
190
SomeGuy

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)

更新

From serDefaults documentation

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

32
Ben
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
Hasanaga

前の回答に従って、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)
    }
}
0