Swift编程入门第2部分—值类型,引用类型,指针和集合类型

之前,我们讨论过变量,常量和类型。

开始Swift编程第1部分-变量,常量和类型
我知道那里有很多教程,Apple有很好的学习Swift的资源,包括他们的WWDC视频…… medium.com

在这一部分中,我们将讨论几个特殊类型,但是为了深入实现这一点,我们必须首先讨论值类型,引用类型和指针。

提醒一句,指针可能是最难掌握的概念之一,我会尽力而为。

初步的东西

是的,我们上次这样做,现在我们将再次进行。
上一次我们讨论了内存以及它如何以块,字节和位的形式排列。 我想在这里对此进行扩展,并为您提供一些有关内存工作原理的直观表示。

让我们创建一个包含值Hello的字符串。 我们之前没有做过什么特别的事情。

我在上一篇文章中告诉您,内存具有价值。 如果我们可以看一下该内存,它将像这样存储:

我敢打赌,您要问的是\0在字符串的末尾。 这称为空终止符。 斜线表示程序已准备好执行命令,零表示没有任何意义。 这是字符串值的存储方式,并在字符串允许使用空格的同时让程序知道字符串何时完成。

数字略有不同。

数字存储为二进制数字。 二进制很容易理解,从内存块最右边的1开始,向左移动,每次将当前值乘以2。 如果您对图形卡或记忆棒有所了解,这就是为什么我们会看到8位(Atari,NES),16位(Sega Genesis,SNES),32位(PlayStation),64位(Nintendo 64)和以此类推。

在二进制中,如果位置为0,则表示关闭,这是错误的。
如果位置为1,则为开或为true。
基于此逻辑,我们只需要计算位置为1的位置即可。 您能找出上图中的数字吗?

现在,这是一组8位内存,是的,它是一个完整的内存字节。 之前我说过字符串中的每个字符都是2个字节,这意味着我们使用16位来存储字符。 16位二进制文​​件的最大值为256。但是,当我们谈论位置时,我们总是从0开始。因此16位二进制数的范围是0-255 。 我敢打赌,您在问我们如何才能使字符超出此范围。 好吧,在这种情况下,我将带您到ASCII表,您可以在其中查看自己的值。 您甚至还会看到隐藏的字符,例如空终止符/0如上所示。

内存将值存储在静态内存中,该位置称为stack ,而该位置称为堆。

可以快速访问静态内存和堆栈内存,但是从堆访问内容的速度很慢(以计算机时间计)。 尽管对您来说似乎并不慢,但从堆栈加载可能要花费一毫秒或更短的时间,而从堆加载可能要花费10毫秒。 在介绍事物时,我将解释它们的实现位置,以便您以后知道将其放置在何处。

值类型

值类型很容易学习,这就是我们自然地思考事物的方式。 当您描述某些事物时,例如说一个高尔夫球,您可能会说一个高尔夫球很小,或者一个篮球是橙色。 值类型是包含您要查找的值的内存。 如果您将值8存储在内存中,然后再要求输入该值,则会收到数字8,非常简单,对吧?

字符串,整数,双精度型,浮点型和布尔型都是值类型,还有更多,但是我们还没有涉及它们,到目前为止,我所有的例子都是值类型。 值类型存储在堆栈中。 如果在它们前面添加静态元素,那么它们会添加到静态内存中,而不仅仅是在各处都这样做,这会带来另一个问题,我将在后面讨论。

参考类型和指针

引用类型在某种程度上类似于值类型,因为它们可以为您提供与值类型相同的值,但它们可以为您提供更多的价值。 引用类型使用指针为您提供所需的值。

之所以要准备这么长的篇幅,主要是因为本节有保证。

如果您看一下C和Objective-C程序,您会发现到处都使用了指针,看起来像这样

集合类型

继续本部分的最后一部分。 集合类型是包含项目集合的类型。 主要有两种类型, 数组字典

  1. 数组 —数组包含有序的类似元素, 通过其索引对其进行寻址 。 索引由数组开始处的项数定义。 如果我们这样定义一个数组
    var myArray = ["eggs", "milk", "butter", "cheese"]
    我们可以使用'myArray[0]'来获取每个值,因为它从数组开始处为0位,因此可以得到eggs值。 使用这个逻辑,如果我们想要butter我们将使用myArray[2]因为它距eggs 2地方。
    如果我们想更改存储在数组中的值,可以使用
    var myArray[2] = "Sugar"
    定义数组的类型用方括号括起来,如本例所示var myIntegerArray = [Int]()
    var myIntegerArray = [Int]()
    它们都可以用类型声明并实例化而没有值
    var myDoubleArray: [Double] = []
    在C字符串中,这令人惊讶地更有意义。 当我们将Bob存放在c字符串中时,实际上是制作了一个字符数组(因此为char类型)。 如果我们说name[0] ,它将只返回B因为从数组开始到内存为0。 您只需要注意不要在数组的边界内,否则,您将遇到问题。 大多数情况下,计算机会避免您说“索引超出范围”或类似的说法。 如果在程序运行时遇到此问题,它将崩溃。
  2. 字典 -我会给您一个猜测,为什么这样命名。 字典与数组相似,因为它们包含通用类型的值,但是它们是无序的,因此有所不同。 它们确实包含索引,但是索引通常是字符串值。 因此,有了这些知识,您可能会想到字典中的单词,然后是其定义。 那是关于它如何工作的。 您可以使用以下命令定义字典
    var myDictionary = ["Kevin": "Lead Minion", "Bob", "Determined Minion", "Stewart": "Rocker Minion"]
    我们可以使用myDictionary["Kevin"]来获得其中任何一个的价值
    您可以使用与数组相同的语法在字典中设置值,只需要使用来设置值即可 ,只要值类型可以与字典的值类型一起使用即可。
    myDictionary["Bob"] = "King Bob"
    myDictionary["Bob"] = 2是不允许的,因为字典的类型为[String: String]
    :将键与值分开。 您可以使用声明和实例化字典
    var myStringDictionary = [String: String]()
    要么
    var myStringIntDictionary: [String: Int] = [:]
    两者都是有效的。

字典和数组在Swift中广泛使用。 您需要注意数组以使其位于元素的范围之内。 字典会更宽容一些,如果您尝试访问字典中不存在的值,那么您将一无所获。 字典和数组都存储在堆栈中(除非使用malloc,否则它们将存储在堆中)

摘要

因此,今天我们了解了值类型,引用类型,集合类型以及有关内存的更多信息。

下一步是什么

在下一篇文章中,我们将介绍运算符,可选参数和nil值。 大部分的初步背景信息已经结束,不久我们将在编程中获得乐趣。

开始Swift编程第3部分-运算符,可选和Nil值
在上一篇文章中,我们介绍了值类型,引用类型以及集合类型。 今天我们仍在继续… medium.com