Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问UserDefaults Swift 3中的变量_Swift_Variables_Sprite Kit - Fatal编程技术网

访问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

只要在你需要的时候按照上面的方式阅读就行了。关于此方法,需要注意以下几点:

  • 当其他控制器修改该值时,您可以使用键/值观察来检测该值的更改,但您需要小心,因为如果您忘记正确删除观察者,KVO可能很容易崩溃

  • 您可能应该对其调用
    synchronize
    ,这将强制您对磁盘所做的更改。这将确保如果你的应用程序突然关闭,你已经保护了数据

  • 当您想要保存的数据少于10条时,UserDefaults非常适合,比如最高分数或一组首选项(这就是它的功能),但对于大型数据结构来说,UserDefaults并不适合。您应该查看CoreData或KeyedArchiver以查找更大的内容

  • 专业提示:与其反复使用松散的字符串“coinSaved”,不如在某个地方定义一个静态常量,或者使用字符串类型的枚举预先定义一次所有值。然后完成代码并避免错误

  • 因此,上面的代码看起来更像:

    在一个视图控制器中:

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