在上一章中,我们一起学习了简单数据类型的“整型Int”,“双精度浮点型Double”,还有“字符串String”。今天,我们来一起探索使用布尔型存储真值,并使用插值建立字符串。

如何使用布尔型来存储真值

到目前为止,我们一起学习了字符串、整数和小数。但是有第四种类型的数据其实已经在我们上一章中被提及:一种非常简单的类型——布尔型 Bool。布尔型用来存储真或假。它是以英国数学家乔治·布尔的名字来命名的。

如上一章中,我们提到的代码:

let filename = "Beijing.jpg"
print(filename.hasSuffix(".jpg"))

let number = 100
print(number.isMultiple(of: 5))

当我们输入以上代码运行后,我们可以在Xcode的控制台看到打印结果:两个true。这便是布尔型的值。使用hasSuffix()和isMultiple(of:)返回的值只有两种情况:字符串要么有后缀,要么没有,100是5的倍数,要么就不是。总有一个简单的真(true)或假(false)。

声明一个布尔型的变量或常量和声明其他数据类型一样,除了你只能给它分配一个真或假的初始值,就像这样:

let goodDogs = true
let gameOver = false

你还可以从其他一些代码中分配布尔型的初始值,只要它返回的结果是真或假:

let isMultiple = 120.isMultiple(of: 3)

与其他类型的数据不同,布尔型没有算术运算符,例如+或-,毕竟true + true是什么真的不符合逻辑。但是布尔型真的有一个特殊的运算符,它就是“!”,意思是“不是”。这个运算符会将布尔值从真变成假,从假变成真。

例如,我们可以像这样翻转布尔值:

var isAuthenticated = false
isAuthenticated = !isAuthenticated
print(isAuthenticated)
isAuthenticated = !isAuthenticated
print(isAuthenticated)

运行以上代码,会先打印“true”,然后打印“false”。因为isAuthenticated以false开始,我们将其设置为非false,就是true,然后再次翻转它,就变成了false。

布尔值确实有一些有用的额外功能。特别是,如果在布尔值上调用 toggle(),就会将真值翻转为假值,将假值翻转为真值。要尝试这样做,可以将 gameOver 设为一个变量,然后像这样修改它:

var gameOver = false
print(gameOver)

gameOver.toggle()
print(gameOver)

这将首先打印 false,然后在调用 toggle() 后打印 true。是的,这与使用 ! 相同,只是代码略少而已,这在处理复杂代码时会很有用!

如何将字符串连接在一起

上一章我们学习了字符串类型,这一节我们来说说如何将不同的字符串组合在一起的方法。

Swift为我们提供了两种不同的字符串组合方法:使用“+”连接,或是使用一种称为“字符串插值”的特殊方法,可以直接将任何类型的变量放置在字符串中。

让我们先从简单的开始,使用“+”将字符串连接在一起。当你有两个字符串时,你只需使用“+”即可将它们合并成一个新的字符串,就像这样:

let firstPart = "Hello, "
let secondPart = "world!"
let greeting = firstPart + secondPart

你还可以将三个字符串连在一起,就像这样:

let people = "Haters"
let action = "hate"
let lyric = people + " gonna " + action
print(lyric)

当运行这段代码时,控制台会显示:”Haters gonna hate“,这是另外一个“Swift”,Taylor Swift的一句歌词。

注意:我可以使用“+”来连接两个字符串,但是你会不会想——我们在学习整数和小数时用到的复合赋值运算符“+=”。那么对于字符串,我们同样也可以使用“+=”,它可以将一个字符串直接添加到另一个字符串中。

这种方法对简单的操作很有效,但也不能经常使用。要知道,每次 Swift 看到两个字符串用 + 连接在一起时,它都要先用这两个字符串创建一个新字符串,然后才能继续。

例如:

let luggageCode = "1" + "2" + "3" + "4" + "5"

其实Swift不会一次性加入所有这些字符串,相反,它将前两个先组成“12”,然后将“12”和“3”组成“123”,然后再使用“123”和“4”组成“1234”,最后再用“1234”和“5”组成“12345”。它会使用临时字符串来保存“12”、“123”、“1234”,即使代码完成后它们最终没有被使用,这无疑增加了运算的复杂性。

于是,Swift有一个更好的解决方案,称为“字符串插值”。它使我们能够有效地从其他字符串创建字符串,也可以从Int、Double等类型的数据创建字符串。

如果你还记得我们在上一章提到过的一段代码,我说过你可以在字符串中加入双引号,只要它们前面有反斜杠,这样Swift就知道这个双引号需要被写进字符串而不是表示字符串的开始或结束。

let quote = "Then he tapped a sign saying \"Believe\" and walked away."

字符串插值使用非常相似的方法:在字符串中写一个反斜杠,然后将变量或者常量的名称放在其后的括号里。

例如,我们可以创建一个字符串常量和一个整数常量,然后将它们放进一个字符串中一起组成一个新的字符串:

let name = "Andy"
let age = 26
let message = "Hello, my name is \(name) and I'm \(age) years old."
print(message)

当代码运行时,它将打印“Hello, my name is Andy and I’m 26 years old.“

字符串插值比使用“+”逐个连接字符串要有效得多,但还有一个很重要的好处:你可以提取整数或小数的值,把它们放进一个字符串中,而无需额外的工作。

例如,如果使用“+”将字符串+整数+字符串连接在一起的时候,我们是不可以这样操作的:

let number = 11
let missionMessage = "Apollo " + number + " landed on the moon."

如果要纠正上面的代码,我们必须要把number变成字符串:

let missionMessage = "Apollo " + String(number) + " landed on the moon."

但是,如果我们使用字符串插值,就没那么繁琐:

let missionMessage = "Apollo \(number) landed on the moon."

**提示:**如果你愿意,可以将计算放入字符串插值中。例如,下面的代码可以打印“3 x 5 = 15“:

print("3 x 5 = \(3 * 5)")

为什么Swift会有字符串插值?

当需要向用户显示信息时,你会发现我们通常会严重依赖于字符串。无论是屏幕上显示的对话框还是按钮上的文本,还是任何你想要表达想法的东西。

当然,我们不会只需要静态的字符串,因为我们想要向用户展示的是他们可以使用的数据。因此,Swift为我们提供了字符串插值。作为在运行时将自定义数据注入字符串的一种方式:它用我们提供的数据替换字符串的一个或多个部分。

例如:

var city = "Shanghai"
var message = "Welcome to \(city)!"

在这个例子中,我们可以直接将城市的名字放进字符串中——“Welcome to Shanghai!“,但是在真正的应用程序中,动态插入才是最重要的。因为它让我们显示的是用户想要的数据,而不是我们自己预先设定好的不可更改的内容。

我们可以将用户输入的城市名替换变量city的值,那么用户所能看到的就不是固定的”Welcome to Shanghai!”,就可以是Beijing、Hong Kong或者是New York等等。

Swift能够将任何类型的数据放置在字符串插值中,但结果可能并不总是有用。不过,对于Swift的所有基本类型——字符串、整数、布尔型等都工作良好。

**提示:**字符串插值在Swift中非常强大,在将来我们会再度深入的了解它的更多用法。

总结:简单数据类型

好了,至此我们基本上完成了Swift简单数据类型的学习。让我们一起来总结回顾一下:

  • Swift允许我们使用 let 创建常量,使用 var 创建变量。
  • 如果你不打算更改值,请确保使用let,以便Swift可以帮助你避免错误。
  • Swift的字符串String可以存储文本,从单词到整本书都可以。也适用于表情符号或事世界上任何语言,不仅仅是英语,并具有许多功能,例如count和uppercased()。
  • 你可以使用双引号放在开头和结尾处来创建字符串,但如果需要是多行字符串的话,请使用三个引号。
  • Swift可以使用整数作为数据类型,它们可以是正的,也可以是负的。同样Int类型也有很多功能,isMultiple(of:)就是其中之一。
  • Swift的小数通常使用Double类型,即双精度浮点数。它可以容纳非常大的数字,但记住它们不是100%精确的,当你需要数字是100%精确的时候,例如在处理金钱数据时,你不应该使用它们。Swift有更精确的一种数字类型,它叫做Decimal,这个将来再介绍。
  • Swift有许多内置的算术运算符,如:+、-、*、/等,以及还有直接修改变量的特殊复合赋值运算符,例如+=。
  • 你可以使用布尔值来表示真或假的状态,布尔值可以使用“!”运算符来翻转其值,也可以使用toggle()来实现一样的效果。
  • 字符串插值使我们能够以简化、高效的方式将变量和常量放进字符串中。

内容很多,也许你并不能一次性记住所有内容。不过,在未来构建应用程序的时候,我们会反复的使用这些内容,相信我,这些内容我们会在将来不停地反复使用,很快你就会发现你无需再回到这里参考这些就能记住所有这一切了。

思考题

既然学习了一些内容,我们就来做一个思考题,验证一下我们学习的效果:

使用Xcode或是Playgrounds,新建一个Swift playground,编写你的第一个Swift代码,实现如下功能:

  • 创建一个常量,保存一个摄氏度的温度值
  • 将其转换为华氏度,方法是摄氏度乘以9,除以5,然后加32
  • 通过print命令将其结果打印出来,同时显示摄氏度和华氏度
  • 你可以多改变几次这个摄氏度变量的值,查看一下不同值所对应的华氏度是多少
答案不是唯一,但可以参考如下:(展开折叠即可)

let celsius: Double = 37.0 

let fahrenheit: Double = celsius * 9 / 5 + 32 

let result: String = "\\(celsius)°C is \\(fahrenheit)°F." 

print(result)

如果你做对了,那么从下一章开始,我们将一起学习复杂数据类型!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注