访问UserDefaults Swift 3中的变量
这似乎是一个基本问题,但我不知道答案。在我的应用程序中,你在每次玩游戏后都可以赢取硬币。这是我赚硬币和存钱的代码访问UserDefaults Swift 3中的变量,swift,variables,sprite-kit,Swift,Variables,Sprite Kit,这似乎是一个基本问题,但我不知道答案。在我的应用程序中,你在每次玩游戏后都可以赢取硬币。这是我赚硬币和存钱的代码 let defaultCoins = UserDefaults() var coinNumber = defaultCoins.integer(forKey: "coinSaved") coinNumber = coinNumber + score defaultCoins.set(coinNumber, forKey: "coinSaved") 我希望能够
let defaultCoins = UserDefaults()
var coinNumber = defaultCoins.integer(forKey: "coinSaved")
coinNumber = coinNumber + score
defaultCoins.set(coinNumber, forKey: "coinSaved")
我希望能够从不同的视图控制器访问coinNumber,并能够使用它。因此,也许可以制作一个变量=coinNumber,我可以在任何地方访问它。我有一家店铺,希望在用户拥有1000枚硬币时能够购买一个新角色,但目前无法购买,因为我不知道如何从我的shopViewController访问coinNumber您的主要问题是,无论何时尝试访问它,您都在创建一个新的
UserDefaults
对象,您应该使用UserDefaults.standard
实例,或者创建一个具有特定标识符的实例
如果你打算在多个视图控制器中使用这些硬币,我还建议你创建一个单例来管理这些硬币,这样可以节省你反复写同样的安全检查的时间(比如确保你不能花比你更多的硬币)
它看起来像这样:
class CoinManager {
static let shared = CoinManager()
private var _coins: UInt {
didSet {
UserDefaults.standard.set(_coins, forKey: "coinSaved")
}
}
var coins: UInt { return _coins }
private init() {
_coins = UInt(UserDefaults.standard.integer(forKey: "coinSaved"))
}
func spend(coins: UInt) -> Bool {
guard _coins > coins else { return false }
_coins -= coins
return true
}
func store(coins: UInt) -> UInt {
_coins += coins
return _coins
}
}
如您所见,其他对象只能读取
coins
属性,但不能直接修改,如果要修改,则必须使用spend
或store
<代码>花费确保你不能花费比你拥有的更多的硬币。因为你正在将数据保存到用户默认值
看来你不需要在视图控制器之间传播它-只要使用默认值作为正确值的“真实来源”。但是,不要将其保存到自定义UserDefaults对象,只需将其保存到为所有iOS/OS X应用程序创建的标准对象即可:UserDefaults.standard
只要在你需要的时候按照上面的方式阅读就行了。关于此方法,需要注意以下几点:
synchronize
,这将强制您对磁盘所做的更改。这将确保如果你的应用程序突然关闭,你已经保护了数据let defaultCoins = UserDefaults.standard
var coinNumber = defaultCoins.integer(forKey: "coinSaved")
coinNumber = coinNumber + score
defaultCoins.set(coinNumber, forKey: "coinSaved")
defaultCoins.synchronize()
然后,在另一个需要读取的控制器中:
let defaultCoins = UserDefaults.standard
let coinNumber = defaultCoins.integer(forKey: "coinSaved")