【问题标题】:Does guard make a copy of variables in swift守卫是否会迅速复制变量
【发布时间】:2019-10-28 14:13:15
【问题描述】:

在 swift 中,您可以使用保护语句解开可选值

guard let foo = foo else { return nil }

此声明是否复制了foo?换句话说,如果foo 非常大,这个语句会不会很昂贵?

【问题讨论】:

  • 我很好奇,您将如何使用这些知识?假设它确实导致了副本,你会怎么做?
  • 一个例子是,如果这是一项昂贵的操作,有更好的解包方法。就我而言,我想知道是否应该在此代码周围使用锁,因为其他线程正在修改foo
  • “一个例子是,如果这是一个昂贵的操作,有更好的解包方法”比如什么?
  • foo! 不会复制吧?或者,最好一开始就避免使用可选项。
  • "foo! 不会复制吧?"你不知道。我的意思是,它碰巧没有,条件绑定也没有,但我没有看到语言文档中的任何地方都明确说明了这一点。如果他们确实导致复制,你会怎么做?你的手有点束缚,你需要这个功能,不管它是否会导致复制。

标签: swift performance memory


【解决方案1】:

实际上这取决于foo 的类型,例如class 类型不会像struct 类型那样创建副本

guard 不是一个神奇的关键字,它只是 if not 在 1 个单词中呈现

【讨论】:

    【解决方案2】:
     guard let foo = foo else { return nil }
    

    如果 foo 非常大,这个语句会不会很昂贵?

    不要这样问自己这个问题,而是这样问:如果你说过会怎样

    if foo != nil {
        let foo = foo!
        // everything else here
    }
    

    是说foo! 解开可选的“昂贵”吗?无论您的答案是什么,guard let foo = foo 的答案都必须完全相同,因为它们完全相同做同样的事情:它们测试 nil,如果安全,它们将打开 Optional。这就是他们俩都做的所有。一个只是另一个的语法糖。

    【讨论】:

      【解决方案3】:

      你有两种方法:

      1- 仅检查此 foo 是否不等于 nil
      在这种情况下,您可以检查 foo 是否为 nil

      if foo != nil {
          // do you work here
      }
      

      2- 从 foo 获取信息
      在这种情况下,您必须解开这个可选的(使用 guard-let 或 if-let 语句),这里我们有两种情况:
      - 如果 foo 是一个类,那么它是一个引用类型。所以不会有副本,并且会创建对此实例的引用
      - 如果 foo 是一个结构,那么它是一个值类型。因此创建了一个全新的实例(从原始实例复制)
      你也可以阅读这个answer,看看你应该在swift中选择结构还是类

      【讨论】:

        【解决方案4】:

        如果您要解包的属性是引用类型(例如类),那么它不会复制,它只会创建一个引用原始实例的新属性。

        如果您要解包的属性是值类型(例如结构),那么它将进行复制。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 2016-04-26
          • 2021-05-25
          • 1970-01-01
          相关资源
          最近更新 更多