Swift 惰性和可选属性

2024-02-19

和有什么区别Lazy or Optional斯威夫特的财产?

例如,如果有人正在构建一个从侧面进入的导航栏,我认为这一切都应该在一个内UIViewController。用户可能永远不会打开菜单,但有时他们会。

var menu: NavigationBar?
lazy var menu: NavigationBar = NavigationBar.initialize()

我认为这两个可选代码都是很好的代码,因为除非需要,否则它们不会创建视图。我明白Optional意味着可能有一个值nil。我也明白Lazy意思是在我需要之前不要担心它。

具体问题

我的问题是他们的性能模式(安全性和速度)是否表明选项更快更安全,反之亦然?


好吧,这是一个有趣的问题,我不想暗示现有的答案不好,但我想我应该提出我的看法。

lazy变量非常适合需要设置一次,然后永远不会重新设置的事情。它是一个变量,因此您可以将其更改为其他内容,但这违背了变量的目的lazy变量(根据需要自行设置)。

选项更多的是那些可能会消失(并且可能会再次出现)的东西。每次都需要设置它们。

因此,让我们看一下侧面菜单的两种情况:一种是在不可见时保留在旁边,另一种是在被释放时保持不变。

lazy var sideMenu = SideMenu()

所以第一次sideMenu属性被访问,SideMenu()被调用并将其分配给该属性。即使您不使用该实例,该实例也会永远保留。

现在让我们看看另一种方法。

var _sideMenu: SideMenu?
var sideMenu: SideMenu! {
    get {
        if let sm = _sideMenu {
            return sm
        } else {
            let sm = SideMenu()
            _sideMenu = sm
            return sm
        }
    }
    set(newValue) {
        _sideMenu = newValue
    }
}

(请注意,这仅适用于类,不适用于结构。)

好的,那么这有什么作用呢?它的行为非常类似于lazyvar,但它可以让你将其重新设置为nil。因此,如果您尝试访问sideMenu,您一定会获得一个实例(要么是存储在_sideMenu或新的)。这是一个类似的模式,它延迟加载SideMenu()但这一个可以创造很多SideMenu()实例,而上一个示例只能创建一次。

现在,大多数视图控制器都足够小,您可能应该使用lazy从早些时候开始。

因此,对于同一问题有两种不同的方法。两者都有优点和缺点,并且在不同情况下效果更好或更差。

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

Swift 惰性和可选属性 的相关文章

随机推荐

  • R 函数在 left_join 中进行故障恢复?

    我有 20 多个不同的数据表 其中的数据由相同的编码系统 北美行业分类系统 NAICS 索引 我想将它们连接到一个表中 问题是每个表中都有不同级别的详细信息 当我加入时 我希望通过失败编码系统的层次结构直到找到匹配来找到最佳匹配 一个常规的
  • 如何在 VBA 中处理工作表(unicode VBA 显示和处理)中西里尔字母引起的错误(#REF)?

    我想从特定的工作簿中获取数据 有几十个工作簿 循环部分工作正常 但下面的代码不起作用 因为工作表采用西里尔字母 并且它们给出了值 到sheet As String范围 我想问如何在不打开工作簿的情况下强制重命名它 无需Workbook Op
  • Laravel 4 Auth:尝试不起作用

    我在使用 Laravel 4 Auth attempt 方法时遇到了困难 遵循了正确的文档 阅读了几个 SO 线程 但我仍然无法让它工作 userData array email gt email protected cdn cgi l e
  • MySQL 使用日期时间进行选择,仅按日期分组

    是否可以从 MySQL 表中选择日期时间字段并仅按日期分组 我正在尝试输出多次发生的事件列表 并按发生日期分组 我的表 数据如下所示 时间戳是日期时间字段 1 2010 03 21 18 00 00 Event1 2 2010 03 21
  • 如何使用 Perl 将字符串转换为浮点数?

    有没有类似的功能int 哪个可以将字符串转换为浮点值 我目前正在使用以下代码 input int substr line 1 index line 1 我需要转换返回的字符串substr浮 只需使用它即可 在 Perl 中 看起来像数字的字
  • 如何根据一定的标准对列表进行排序

    例如我有一个清单 list word1 0 234 word2 0 2 word3 0 5 word4 0 67 我想按重要性对其进行排序 重要性是指该值距 0 5 有多远 排序后的列表应该是 list word2 0 2 word1 0
  • Windows Batch 读取文件并将行解析为标记和变量

    通过搜索这个网站并学习 Windows 批处理脚本这一荒谬的语言 我已经取得了很大的进展 但我现在陷入了困境 我有一个行数可变的文本文件 每行看起来像 AA8315 United States N777AN American Airline
  • 如果对象已经是同一或另一个状态树的一部分,则无法将对象添加到状态树

    mobx state tree module js f7d3 2154 未捕获错误 mobx state tree 如果对象已经是同一或另一个状态树的一部分 则无法将对象添加到状态树 我只是通过过滤另一个状态来得到这个错误 const da
  • JsDoc命名空间

    我正在使用 JsDoc 编辑 js 文件以获得干净的文档 我的结构非常简单 Finds an object param string prop Property Array prototype findObject function fin
  • 将 RGB 颜色存储在 MySQL 中。 char 还是 int 更好?

    我使用 PHP 从 MySQL 数据库查询 CSS 设置 然后将其回显到 CSS 样式表中 示例片段如下
  • ClickOnce 应用程序用户设置位置

    我目前正在开发一个 ClickOnce 应用程序 用于转换 CSV 文件以进行数据库更新 该程序要求用户能够更改数据库更改的配置文件 并更改填充应用程序中下拉列表的 XML 文件 现在我知道这些文件保存在 user appdata 文件夹中
  • 为什么我的 Perl 祝福文件句柄不使用“can('print')”返回 true?

    由于某种原因 我无法让文件句柄与 Expect pm 一起使用log file方法 我最初得到的帮助是如何将文件句柄传递给 Perl Expect 的 log file 函数 https stackoverflow com question
  • 在 pymongo 中快速或批量更新

    如何在 pymongo 中进行批量更新插入 我想更新一堆条目 但一次更新一个非常慢 几乎相同问题的答案在这里 MongoDB 中的批量更新 更新插入 https stackoverflow com questions 4444023 bul
  • 与 CMake 交叉编译时的 Makefile 生成器规范

    我有两件事无法弄清楚 1 使用时CMake GUI 我们可以指定makefile生成器 我将使用 Debian Linux 交叉编译 Raspberry PI 我找不到相关的生成器 我必须选择哪种发电机 我有toolchain rpi cm
  • fscanf 读取最后一个整数两次[重复]

    这个问题在这里已经有答案了 我有以下简单的程序来读取文本文件 num txt 该文本文件每行包含数字 1 2 3 4 5 当我运行该程序时 它打印 5 两次 谁能告诉我为什么会发生这种情况以及如何解决它 提前致谢 int main void
  • 如何创建自动滚动列表

    我正在尝试使用 CSS 动画构建自动滚动列表 我现在得到了什么 players webkit transition opacity 0 5s ease out webkit animation autoScrolling 5s linear
  • Mac Spark-shell 初始化 SparkContext 时出错

    我尝试在 Mac OS Yosemite 10 10 5 上使用启动 Spark 1 6 0 spark 1 6 0 bin hadoop2 4 bin spark shell 它有以下错误 我也尝试安装不同版本的 Spark 但都有相同的
  • d3:在transition.tween() 中使用*name* 参数

    根据文档transition tween https github com mbostock d3 wiki Transitions tween calling transition tween name factory 为指定的对象注册一
  • 如何检查两个日期时间是否在彼此的特定范围内?

    我有两个 datetime64 对象 a 和 b 我想确定它们是否在彼此的特定范围内 然而 范围并不对称 如果a在b的 30到120分钟之间 a比b早半小时到晚2小时之间 则两者在期望的范围内 我的日期时间对象看起来像 m d Y H M
  • Swift 惰性和可选属性

    和有什么区别Lazy or Optional斯威夫特的财产 例如 如果有人正在构建一个从侧面进入的导航栏 我认为这一切都应该在一个内UIViewController 用户可能永远不会打开菜单 但有时他们会 var menu Navigati