SwiftUI 内功修改之 Refereces 和 Values的区别

Refereces 和 Valuess 是啥,和我开发App赚钱有关系么。表面上看是没有一点关系,但是从长远上看关系很大,因为每一个成功并且伟大App都是构建在这两个概念之上的。

本文的阅读方式,您将能学到内容

  • 看不懂没关系,先把几个关键词了解了。这样在看别人的代码时至少能知道大牛们在做什么。

对于任何认真的Swift开发人员而言,了解和利用引用类型和值类型之间的差异是一项至关重要的技能。这不是“有用的知识”或“好知识”,而是至关重要的–我并不是在轻率地说这一点。

好了,请大家沏杯茶或冲杯咖啡,让我们来慢慢聊

我们先看看下面的代码有什么区别

class Target1 {
    var location = ""
}
struct Target2 {
    var location = ""
}

代码几乎完全相同,只是一个单词不同。但是结果却是很大的:Target1是一个class,Target2是个struct。

Swift是一种积极的以数据为导向的语言,这意味着它的大多数数据类型是值而不是引用。布尔值,整数,字符串,元组和枚举都是值类型。甚至数组和字典都是值类型。

var a = [1, 2, 3] 
var b = a 
a.append(4) 
print(b.count)

值类型比引用类型更简单,这不是坏事。当您提供价值以供使用时,可以确定它的价值不会出乎意料地改变,因为您拥有自己的独特副本。您还可以轻松地比较值类型,并且它们如何获取值并不重要-只要两个值看起来相同,它们就相同。例如,即使a和b的创建方式非常不同,下面的代码也会显示“等于”


let a = [1, 2, 3]
let b = Array(1...3)
if a == b { print("Equal") }

简而言之,引用是在分配时共享的,因此可以有多个所有者,而值在分配时被复制,因此只有一个所有者。

Closures 是 references

这一点可能会伤到您的大脑,如果您很少复制闭包(Closures),则可以完全跳过本章。
先别跳,其实在SwiftUI世界里closuer时无处不在的,咱们还是好好了解一番吧。

正如我已经说过的那样,布尔值,数字,字符串,数组,字典,结构等都是Swift中的值类型。类是引用类型,闭包也是。对于简单的闭包,这并不重要。例如,下面的代码将一个简单的闭包存储在printGreeting中,调用它,将其分配给copyGreeting,然后调用

还有 86% 的精彩内容

推荐阅读更多精彩内容