您可以使用保护语句迅速包装可选值
guard let foo = foo else { return nil }
此语句是否复制了foo
?换句话说,如果foo
很大,此语句可能会很昂贵吗?
答案 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)
如果您要展开的属性是引用类型(例如类),则不会进行复制,它只会创建一个引用原始实例的新属性。
如果您要解包的属性是值类型(例如结构体),那么它将进行复制。