警卫队迅速制作变量副本吗

时间:2019-06-13 23:32:14

标签: swift performance memory

您可以使用保护语句迅速包装可选值

guard let foo = foo else { return nil }

此语句是否复制了foo?换句话说,如果foo很大,此语句可能会很昂贵吗?

4 个答案:

答案 0 :(得分:1)

 guard let foo = foo else { return nil }
     

如果foo非常大,此语句可能会很昂贵吗?

不要这样问自己,而要这样问:如果你说了怎么办

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

是说foo!来解开可选的“昂贵”商品吗?无论您的答案是什么,guard let foo = foo都必须完全相同,因为它们都完全做同样的事情:它们测试nil,并且在安全的情况下将它们解开。可选的。那就是它们都全部。一个仅仅是另一个的语法糖。

答案 1 :(得分:0)

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

guard不是魔术关键字,它只是if not(用一个词表示)

答案 2 :(得分:0)

您有两种方法:

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

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

2-从foo获取信息
    在这种情况下,您必须解开此可选内容(使用guard-let或if-let语句),这里有两种情况:
    -如果foo是一个类,则它是引用类型。因此不会有副本,并且会创建对此实例的引用
    -如果foo是结构,则为值类型。因此创建了一个全新的实例(从原始副本复制)
    另外,您还可以阅读此answer,以了解是否应迅速选择结构或类

答案 3 :(得分:0)

如果您要展开的属性是引用类型(例如类),则不会进行复制,它只会创建一个引用原始实例的新属性。

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