如何传递对布尔值的引用而不是其值?

2023-12-07

我想使用布尔值作为状态存储。

为了做到这一点,我需要能够从项目中的不同位置更改它们的状态。

为此,我需要在某个地方存储它们,以及一种传递对它们的引用的方法。

我尝试将它们存储为GameManager 中的静态变量,但传递对这些的引用似乎只是传递 true 或 false 的值,而不是引用。

我如何实现拥有一个合格的布尔引用的目标我可以从项目的任何部分更改它的状态吗?

UPDATE:

这可能不是最好的方法,但这实现了拥有一堆我可以在游戏世界中使用的状态布尔值的目标:

class GameManager {

    static let sharedInstance = GameManager()

    var previewAudioIsON: Bool = false
    var previewVisuaIsOn: Bool  = false
    var timerDisplayIsOn: Bool  = false
    var quickStartIsOn: Bool  = false

    func touchedPreviewAudioButton() -> Bool {
        if previewAudioIsON { previewAudioIsON = false}
        else { previewAudioIsON = true }
     return previewAudioIsON
    }

    func touchedPreviewVisualButton() -> Bool {
        if previewVisuaIsOn { previewVisuaIsOn = false }
        else { previewVisuaIsOn = true }
     return previewVisuaIsOn
    }

    func touchedTimeDisplayButton() -> Bool {
        if timerDisplayIsOn { timerDisplayIsOn = false }
        else { timerDisplayIsOn = true }
     return timerDisplayIsOn
    }

    func touchedQuickStartButton() -> Bool {
        if quickStartIsOn { quickStartIsOn = false }
        else { quickStartIsOn = true }
     return quickStartIsOn
    }
}

前几天我给了你部分错误的信息(我当时脑子里放屁),需要为此道歉。我在测试中忽略了一些东西......

如果您不想制作,这就是您需要的RefBool我建议的实例(需要更多跑腿工作,不推荐):

/// Mutates a boolean:
func toggle(_ boolean: inout Bool) -> Bool {
  boolean ? (boolean = false) : (boolean = true)
  return boolean
}

/// Static state manager for Booleans
struct IsOn {

    private static var
    _previewAudio  = false,
    _previewVisual = false,
    _timerDisplal  = false,
    _quickStart    = false

    enum State { case toggle, get }

   static func previewAudio(_ toggleVal: State = .get) -> Bool {
    if toggleVal == .toggle { toggle(&_previewAudio) }; return _previewAudio
  }

   // ... others
}

Testing:

let referenceToPA = IsOn.previewAudio

print ( IsOn.previewAudio() ) // False (default pram works)
print ( referenceToPA(.get) ) // False (can't use default pram)

referenceToPA(.toggle) 

print ( IsOn.previewAudio() ) // True
print ( referenceToPA(.get) ) // True

IsOn.previewAudio(.toggle)

print ( IsOn.previewAudio() ) // False
print ( referenceToPA(.get) ) // False



但老实说,这样做会更容易RefBool从我的其他答案来看,那么您不需要枚举或函数:

/// Holds a boolean in .val:
final class RefBool { var val: Bool; init(_ boolean: Bool) { val = boolean } }

/// Static state manager for Booleans
struct IsOn {
    static var
      previewAudio  = RefBool(false),
      previewVisual = RefBool(false),
      timerDisplal  = RefBool(false),
      quickStart    = RefBool(false)
}

便利功能(非必需):

/// Mutates a boolean:
func toggle(_ boolean: inout Bool) -> Bool {
  boolean ? (boolean = false) : (boolean = true)
  return boolean
}

/// Mutates .val:
func toggle(_ refBool: RefBool) -> Bool {
    refBool.val ? (refBool.val = false) : (refBool.val = true)
    return refBool.val
}

测试2:

let refToPA = IsOn.previewAudio

refToPA.val = true

print(refToPA.val) // true
print(IsOn.previewAudio.val) // true

toggle(&refToPA.val)

print(refToPA.val) // false
print(IsOn.previewAudio.val) // false

toggle(refToPA) // Using our fancy second toggle

print(refToPA.val) // true
print(IsOn.previewAudio.val) // true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何传递对布尔值的引用而不是其值? 的相关文章

随机推荐

  • 将单元格复制到新工作表列时出现错误 429“Activex 组件无法创建对象”

    此代码复制每个工作表中的 P 和 Q 列 并将它们发布到合并的新工作表中 它还删除所有空白单元格 该代码适用于非常小的文件 但不会在新工作簿上产生相同的结果 从以前的 小工作簿 到新工作簿的所有列都是相同的 唯一改变的是工作表的数量 为 6
  • 如何在不使用 TYPE_KEYGUARD 的情况下禁用主页按钮?

    我创建一个锁屏应用程序 我需要禁用主页按钮 因此如果该手机被盗 则无法访问该手机 我的锁屏是全屏活动 我使用此代码禁用主页按钮 但它给了我一些错误 这是代码 Override public void onCreate Bundle save
  • 如何在窗体上绘制透明文本?

    有没有办法在具有某些控件的表单上绘制透明文本 如果我使用TLabel控件 它总是显示在窗体上的控件后面 您不能使用TLabel控件 因为它不是窗口控件 因此它将被窗体的每个窗口子控件隐藏 你可以使用TStaticText 这确实是一个窗口控
  • 如何捕获多个重复组?

    我需要捕获相同模式的多个组 假设 我有以下字符串 HELLO THERE WORLD 我写了以下模式 A Z 我想要它做的是捕获每一个单词 因此第 1 组是 HELLO 第 2 组是 那里 第 3 组是 世界 我的正则表达式实际上捕获的只是
  • 调用控制器中的视图方法

    我想在控制器中调用视图方法 但我不知道如何 我寻找类似的示例 但我没有找到它 我可以在这段代码中做到这一点吗 我是否必须重新构建它 我使用javafx和fxml技术 来构建用户界面 我的视图文件 它有 gotoRegister 和 goto
  • 如何将数据插入 iPhone 中的 SQLite 数据库

    我是 iPhone 开发新手 我想将某些数据插入数据库并检索它 并将其显示在表格中 我创造了Database data sqlite与表 用户 该表有两个值 id varchar 和 name varchar 我通过 insert into
  • 一旦时间戳上指示的时间过去,如何使数据不可读?

    假设用户将一个事件写入 Firebase 数据库 用户写入的内容附加了时间戳 其他用户可以使用 FirebaseListAdapter 读取列表视图中写入的内容 有没有办法在时间戳上的时间过去后使用户写入的数据不可读 无论您拥有单个项目还是
  • 如何将 cogs 与 Discord.py 一起使用?

    我写了一个相当大的 Discord 机器人 它有超过 1000 行代码 当我在 Youtube 和这里 研究如何做到这一点时 似乎没有任何效果 我想知道是否有人可以解释如何正确使用齿轮 可能用照片示例 我可以展示我需要哪些代码来帮助您理解我
  • ~ 究竟做什么? [复制]

    这个问题在这里已经有答案了 我有时会看到这个符号 在代码中 我尝试过 1 它表明0 因此 我可以看到一些使用这个技巧的代码 if text indexOf a 检查真值 这是一种位移吗 这是按位非运算符 它将操作数转换为 32 位整数 然后
  • 如何关闭Objectbox Store并删除数据文件

    我打电话后遇到异常put 与我的数据列表 我知道我之前关闭该框是有原因的 必须关闭deleteAllFiles 我该如何再次打开它 正如我所见 dataBoxStore 在我关闭后不为空 My code dataBoxStore MyObj
  • 为什么我只收到第一个地址字节? (I2C协议)

    期望从机确认并返回数据 但它没有 这是我的协议 这是我的数据表 数据表提到 从机将通过首先发送 MSB 字节来应答 Byte0 和 byte1 包含 预测值 所有字节均由主机确认 Edit 源库 另外仅供参考 我使用的是 Arduino F
  • CKEditor 4:未捕获类型错误:无法读取 null 属性“langEntries”

    我正在使用 Ruby gem 进行 CK 编辑器 https github com galetahub ckeditor 并且我收到此错误 Uncaught TypeError Cannot read property langEntrie
  • 有没有办法构建StAX过滤器链?

    为不同的事件类型进行自定义转换StAX using EventFilter and StreamFilter我觉得被迫进行程序实现 提取这些事件并处理它们 过滤这些事件并处理它们 然后将所有结果放回一起并返回 SAX似乎有一个非常好的功能
  • 没有标题栏的 WS_POPUP 和 WS_OVERLAPPED 有什么区别?

    如果我处理WM NCCALCSIZE对于具有样式的窗口WS OVERLAPPED 我只是简单地返回0当 的时候WPARAM值为TRUE 这将删除窗口边框 这样做和创建一个有什么区别WS POPUP窗户 如果我尝试使用扩展帧 实际帧是否不同D
  • jQuery 变量到 ID 问题

    我有一个名为 nav 的类的按钮 当单击按钮时 将读取 ID 并将变量 pre 设置为 ID 设置变量后 我将删除 id 的一部分 link 这部分工作正常 但可能是我的问题产生的地方 一旦 link 被删除 我将尝试使用 pre 的剩余部
  • Google Apps 脚本正则表达式 exec() 返回 null

    当我在调试模式下运行下面的代码时 我在 for 循环的第一次迭代中得到预期值 但在第二次迭代中得到 null 如图像所示 First iteration Second iteration 我究竟做错了什么 我正在使用的代码是 var new
  • Google 脚本返回的不是数字

    我已经在 Google Scripts 上工作了一段时间 但我似乎找不到解决我的问题的方法 我想做的是将电子表格上两个单元格的内容与我的函数相乘calculateRates 这是我的代码 customFunction function ca
  • 带空格的文件名

    我编写了一个 shell 脚本 它在所有目录中递归地选取所有文件 并准备一份包含上次修改的文件大小的报告 我面临的问题是 很少有名称为 用户界面 的文件 中间有空格 如何在 shell 脚本的 for 循环中使用这些文件并获取其中的文件和目
  • C# 在对话框中更新设置时重新加载/重绘表单

    我有一个 C Win Forms 应用程序 我根据类中的 2 个属性在面板中动态绘制按钮 行和列 我还有一个打开的对话框 它使用 2 个文本框设置这些属性 我在该对话框上有一个名为 保存 的按钮 按下该按钮后 会将主类中的属性 行 列 更新
  • 如何传递对布尔值的引用而不是其值?

    我想使用布尔值作为状态存储 为了做到这一点 我需要能够从项目中的不同位置更改它们的状态 为此 我需要在某个地方存储它们 以及一种传递对它们的引用的方法 我尝试将它们存储为GameManager 中的静态变量 但传递对这些的引用似乎只是传递