iOS Swift 3 - 如何正确使用UserDefalts

时间:2017-04-25 02:41:14

标签: ios swift swift3 nsuserdefaults

有人可以解释我如何在Swift3中使用UserDefaults来完成这项任务:

我想要一个变量币= 0,标签显示"硬币:0",然后有一个按钮,点击更新硬币1。

我需要将其保存为UserDefault,以便您可以关闭视图/应用并使硬币数量保持加载/能够为其添加更多内容。

先谢谢!

4 个答案:

答案 0 :(得分:1)

使用UserDefaults时,最好将其包装在协议中并使用枚举作为键。以下是coinsCount的枚举案例以及其他一些示例。

enum Key: String {
    case coinsCount
    case userId
    case recentSearches

    static var all: [Key] = [.coinsCount, .userId, .recentSearches]
}

protocol PersistenceManagerProtocol {

    //MARK: - Delete
    func deleteAll()
    func deleteValue(for key: Key)

    //MARK: - Inspection
    func hasValue(for key: Key) -> Bool

    //MARK: - Save
    func save(_ value: Any, for key: Key)

    //MARK: - Load
    func load<Value>(with key: Key) -> Value?
    func loadArray<Value>(with key: Key) -> [Value]
}


final class PersistenceManager {
    fileprivate let userDefaults: UserDefaults

    init(userDefaults: UserDefaults) {
        self.userDefaults = userDefaults
    }
}

extension PersistenceManager: PersistenceManagerProtocol {

    //MARK: - Delete
    func deleteValue(for key: Key) {
        userDefaults.setValue(nil, forKey: key.rawValue)
    }

    func deleteAll() {
        for key in Key.all {
            deleteValue(for: key)
        }
    }

    //MARK: - Inspection
    func hasValue(for key: Key) -> Bool {
        return userDefaults.value(forKey: key.rawValue) != nil
    }

    //MARK: - Save
    func save(_ value: Any, for key: Key) {
        saveValue(value, for: key)
    }

    //MARK: - Load
    func load<Value>(with key: Key) -> Value? {
        guard let value = userDefaults.value(forKey: key.rawValue) as? Value else { return nil }
        return value
    }

    func loadArray<Value>(with key: Key) -> [Value] {
        guard let array: [Value] = load(with: key) else { return [] }
        return array
    }
}

//USAGE
let persistenceManager: PersistenceManagerProtocol = PersistenceManager(.standard) // using dependency injection, can mock data

persistenceManager.save(237, for: .coinsCount)
let coinsCount: Int = persistenceManager.load(with: .coinsCount)

persistenceManager.save("foobar", for: .userId)
let userId: String = persistenceManager.load(with: .userId)

persistenceManager.save(["foo", "bar"], .recentSearches)
let recentSearches: [String] = persistenceManager.loadArray(with: .recentSearches)

答案 1 :(得分:0)

h, t = 1, 1
my_array = [0,1,2,3,4,5]
middle = my_array[h:-t]

答案 2 :(得分:-1)

尝试这样的事情:

let defaults = UserDefaults() //Declares user defaults

let savedCoins = defaults.integer(forKey: "userCoins")  //declares a variable for your key
savedCoins += 1 //add one when your button is clicked
defaults.set(savedCoins, forKey: "userCoins") //re-saves the new value

每当您想要检索默认值中的值时:

let savedCoins = defaults.integer(forKey: "userCoins") 

每当您想将值设置为默认值时:

defaults.set(savedCoins, forKey: "userCoins")

确保你的钥匙是一样的!

答案 3 :(得分:-2)

我也无法使用NSUserDefaults,我还不是Swift的专家,但我可以告诉你我对它的理解以及它对我的作用:

UserDefaults分两步进行:

第一步:您设置要保存的数据以及何时: 例如,如果您想在按下按钮的同时保存某些内容:

buttonPressed {

Userdefaults.standard.set(list,forKey:&#34; anyKeyYouWantHere&#34;) - &gt;然而,&#34;列表&#34;变量看起来 就像你按下按钮一样,它会像那样保存

}

第二步

例如,如果我想在视图加载时加载列表,在ViewDidLoad中我只给出变量&#34; list&#34;在我关闭应用程序之前支持它的值;

如此:

list = UserDefaults.standard.string(forKey:&#34; theSameKeyFromStep1&#34;)

希望这对你有意义!祝你好运!