Swift入门: 数据类型

2020-03-19 20:42:32 浏览数 (1)

数据种类繁多在Swift中是单独处理他们的。在给变量赋值时,您已经看到了最重要的类型之一,但在Swift中,这称为Swift(字面上是字符串)。

字符串可以是长的(例如一百万个字母或更多)、短的(例如10个字母)甚至是空的(没有字母),这无关紧要:它们在Swift眼中都是字符串,工作原理都是一样的。Swift知道名字应该包含一个字符串,因为当你创建它时,你会给它分配一个字符串:“韦弦zhy”。如果您要将代码重写为该代码,它将停止工作:

代码语言:javascript复制
var name
name = "韦弦zhy"

这一次Xcode将给您一条错误消息:“Type annotation missing in pattern。它的意思是,“我不知道name是什么数据类型,因为你没有给我足够的信息。”

此时,您有两个选项:要么创建变量并在一行代码中为其提供初始值,要么使用类型注释(type annotation),在这里您可以告诉Swift该变量稍后将保持什么数据类型,即使您现在没有为其提供值。

您已经看到过了第一个选项的样子,所以让我们看看第二个:类型注释。我们知道名称将是一个String,所以我们可以通过先写冒号,再写字符串来告诉Swift,如下所示:

代码语言:javascript复制
var name: String
name = "韦弦zhy"

注意:有些人喜欢在冒号前后加一个空格,使var name : String,但是他们错了,你应该尽量避免在不礼貌的场合提及他们的错误。

这里的教训是,Swift总是想知道每个变量或常量将保存什么类型的数据。总是!你逃不开它,这是一件好事,因为它提供了一种叫做类型安全的东西——如果你说“这会保存一个字符串”,然后试着放一只兔子进去,Swift会拒绝的。

我们现在可以通过引入另一种重要的数据类型Int来尝试这一点,Int是integer的缩写,整数是3、30、300或-16777216这样的整数。例如:

代码语言:javascript复制
var name: String
name = "韦弦"

var age: Int
age = 26

它声明一个变量为字符串,一个为整数。请注意,StringInt开头都有大写字母,而nameage则没有,这是Swift中的标准编码约定。编码约定对Swift来说是无关紧要的(你可以写自己喜欢的名字!)但对其他开发者来说确实很重要。在本例中,数据类型以大写字母开头,而变量和常量则不以大写字母开头。

现在我们有了两种不同类型的变量,您可以看到类型安全性在起作用。试着写这个:

代码语言:javascript复制
name = 26
age = "韦弦"

在这段代码中,您试图将一个整数放入一个字符串变量,将一个字符串放入一个整数变量——谢天谢地,Xcode将抛出错误。您可能认为这很迂腐,但它实际上非常有用:您承诺一个变量将保存一种特定类型的数据,而Xcode将在您的工作中强制执行这一点。

在继续之前,请删除导致错误的那两行代码,否则您的Playground上的任何东西都无法继续工作!
Float and Double 浮点数和双精度浮点数

让我们再看两种数据类型,称为FloatDouble。这是Swift用小数部分存储数字的方法,例如3.1、3.141、3.1415926和-16777216.5。这有两种数据类型,因为你可以选择你想要多少精度,但大多数情况下这并不重要,所以苹果官方推荐总是使用Double,因为它有最高的精度。

试着把这个放到你的Playground上:

代码语言:javascript复制
var latitude: Double
latitude = 36.166667

var longitude: Float
longitude = -86.783333

你可以看到两个数字都出现在右边,但仔细看,因为有一个微小的差异。我们说过经度应该等于-86.783333,但在结果窗格中,您将看到-86.78333——它在末尾缺少了一个3。现在,你可能会说,“0.000003有什么关系?”但这很好地证明了我所说的准确性。

因为Playground会随着您键入的内容而更新,所以我们可以尝试一下,这样您就可以确切地看到Float和Double的区别。尝试将代码更改为:

代码语言:javascript复制
var longitude: Float
longitude = -86.783333
longitude = -186.783333
longitude = -1286.783333
longitude = -12386.783333
longitude = -123486.783333
longitude = -1234586.783333

这是在小数点前增加数字,而在小数点后保持相同数量的数字。但是,如果您在结果窗格中看到,当您在点之前添加更多数字时,Swift将在点之后删除数字。这是因为它存储您的号码的空间有限,所以它首先存储最重要的部分——丢失1000000是一件大事,而丢失0.000003则不那么重要。

Float 精度

现在试着把Float改成Double,每次你都会看到Swift打印出正确的数字:

代码语言:javascript复制
var longitude: Double

这是因为Double的精度是Float的两倍,所以它不需要削减你的数字。不过,双打还是有限制的——如果你尝试一个像123456789.123456789这样的大数字,你会发现它会被削减到123456789.1234568。

Boolean 布尔型

Swift有一个内置的数据类型,可以存储值是真是假,称为Bool,Boolean的缩写。布尔没有“也许”或“也许”的空间,只有绝对的:是真是假。例如:

代码语言:javascript复制
var stayOutTooLate: Bool
stayOutTooLate = true

var nothingInBrain: Bool
nothingInBrain = true

var missABeat: Bool
missABeat = false

提示:您会注意到这些变量是以一种非常特殊的方式编写的:我们不编写MissABeatmissabeat或其他此类变体,而是将首字母小写,然后将第二个和后续单词的第一个字母大写。这被称为驼峰命名(camel case),因为它看起来有点像骆驼的驼峰,而且它被用来简化变量名中单词的读取。

聪明地使用类型注释

正如您所了解到的,有两种方法可以告诉Swift变量保存的数据类型:在创建变量时赋值,或使用类型注释。如果你有选择,第一个总是更好的,因为它更清楚。例如:

代码语言:javascript复制
var name = "Tim McGraw"

这比下面的要好:

代码语言:javascript复制
var name: String
name = "Tim McGraw"

这适用于所有数据类型。例如:

代码语言:javascript复制
var age = 25
var longitude = -86.783333
var nothingInBrain = true

这种技术称为类型推断,因为Swift可以通过查看要放入其中的数据类型来推断变量应使用的数据类型。当涉及到像-86.783333这样的数字时,Swift总是会推断出一个Double而不是一个Float

为了完整起见,我应该补充一点,可以指定一个数据类型,同时提供一个值,如下所示:

代码语言:javascript复制
var name: String = "Tim McGraw"

本文来自Hacking with Swift给swift初学者的入门课程Swift for Complete Beginners 的 Types of Data

0 人点赞