Setara dengan iOS untuk Preferensi Bersama Android

105

Saya mem-porting aplikasi Android ke iOS, satu hal yang saya gunakan adalah Preferensi Bersama di Android untuk menyimpan setiap kali level selesai.

Dengan begitu, saat pengguna kembali ke aplikasi, mereka dapat melihat bahwa mereka naik level 3 atau apa pun.

Apakah ada mekanisme serupa di iOS? atau apakah saya harus menulis secara manual ke file khusus aplikasi?

Jika ya, bagaimana cara menulis ke file yang hanya terlihat oleh aplikasi saya?

Terima kasih.

FaddishWorm
sumber
1
Saya kira hal yang paling dekat dengan ini di iOS adalah NSUserDefaults . Dan berikut adalah contoh sederhana tentang cara menyimpan dan mengambil.
Tarek Hallak

Jawaban:

203

Gunakan NSUserDefaults : - perhatikan bahwa ini untuk sedikit data, seperti level saat ini seperti yang Anda sebutkan. Jangan menyalahgunakan ini dan menggunakannya sebagai database besar, karena itu dimuat ke dalam memori setiap kali Anda membuka aplikasi Anda, apakah Anda memerlukan sesuatu darinya atau tidak (bagian lain dari aplikasi Anda juga akan menggunakan ini).

Objective-C:

Bacaan:

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];
}

Penulisan:

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

.

Cepat:

Bacaan:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

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

Penulisan:

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)
}
Beberapa pria
sumber
Anda juga dapat menggunakan pengikatan bersyarat untuk membaca di if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = storedLevel} cepat
Raghu Teja
4
@chitti nope that wont work, integerForKey tidak mengembalikan opsional
SomeGuy
40

Ini adalah pembaruan untuk Swift 3

Bacaan

let preferences = UserDefaults.standard

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

Penulisan

let preferences = UserDefaults.standard

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

Memperbarui

Dari dokumentasi UserDefaults

synchronize()menunggu update asynchronous yang tertunda ke database default dan kembali; metode ini sekarang tidak diperlukan dan tidak boleh digunakan.

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

}

Contoh

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

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

Sesuai jawaban sebelumnya, Anda sudah tahu bahwa UserDefaultsitu setara dengan preferensi bersama di ios. Anda dapat membuat fungsi tulis umum dan fungsi baca buat berdasarkan tipe data. Dan panggil metode yang Anda butuhkan dari mana saja.

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)
    }
}
Md Imran Choudhury
sumber