【问题标题】:iOS Swift 3 - How to properly use UserDefaltsiOS Swift 3 - 如何正确使用 UserDefalts
【发布时间】:2017-04-25 02:41:14
【问题描述】:

谁能解释我如何在 Swift3 中使用 UserDefaults 来完成这个任务:

我想要一个变量coins = 0,其标签显示“硬币:0”,然后有一个按钮,将硬币更新为1。

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

提前致谢!

【问题讨论】:

  • 这个问题有很多部分。你究竟需要什么帮助?使用UserDefaults 的例子不胜枚举。你至少看过参考文档吗?

标签: ios swift swift3 nsuserdefaults


【解决方案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)

【讨论】:

  • @jacob-peterson 进展如何?
【解决方案2】:
var coins = 0
  let saveData = UserDefaults.standard
  saveData.set(coins, forKey: "string you want to use to refer to this save data")

【讨论】:

  • 您忘记了synchronize() 呼叫。
  • 我之前没有使用过该调用,也从未遇到过用户默认设置的问题,嗯,我会调查一下
  • developer.apple.com/reference/foundation/userdefaults/… 操作系统会定期调用它,但通常的做法是在手动之后立即进行调用。
  • @RohanPanchal 不,不需要。这不应该是常见的做法。
  • @rmaddy 你能澄清一个不这样做的理由吗?
【解决方案3】:

试试这样的:

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

确保您的密钥相同!

【讨论】:

  • 我认为在设置值时需要使用savedCoins 而不是coins
【解决方案4】:

我在使用 NSUserDefaults 时也遇到了麻烦,我还不是 Swift 专家,但我可以告诉你我对它的理解以及它对我的作用:

UserDefaults 分两步工作:

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

按钮按下{

Userdefaults.standard.set(list, forKey: "anyKeyYouWantHere") --> 但是“list”变量看起来
就像你按下按钮的那一刻,它会像那样保存

}

第二步

例如,如果我想在视图加载时重新加载列表,在 ViewDidLoad 中,我只需将变量“list”返回它在关闭应用程序之前的值;

这样:

list = UserDefaults.standard.string(forKey: "theSameKeyFromStep1")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多