Swift 3开发指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-27 11:21:35

点击下载

作者:博为峰51Code教研组

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Swift 3开发指南

Swift 3开发指南试读:

前言

Swift语言从发布至今,版本在不断地更新。Swift 3是苹果公司在2016年6月发布的Swift语言的最新版本,它是Swift语言的一个重大的里程碑。在本书编写时,Xcode 8仍处于测试版阶段,因此,本书内容基于Xcode 8.0 Beat版编写。本书内容

我们团队编写本书的目的是满足从事iOS开发的广大读者学习Swift 3语言的需要。同时,已有Objective-C开发经验的人员通过阅读本书能够快速转型到使用Swift语言开发iOS应用。

本书共分为五大部分。

第一部分为基础语法篇,共7章,主要介绍Swift语言的基础知识。

第1章主要对Swift语言进行简单的介绍,Xcode的安装、卸载以及使用,如何阅读Swift开发文档,并介绍了如何使用Xcode的Playground编写和运行Swift程序代码等内容。

第2章主要介绍Swift语言的基本语法,包括标识符、关键字、表达式、语句、注释、常量和变量,以及Swift的基本数据类型,例如整型、浮点型、元组型、可选类型等内容。

第3章主要介绍Swift语言的运算符和表达式,包括算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符等内容。

第4章主要介绍Swift语言的流程控制语句,包括循环语句(for in、while、repeate-while),分支语句(if、switch),控制转移语句(continue、break、fallthrough),语句嵌套等内容。

第5章主要介绍Swift语言的字符和字符串,包括获取字符串的长度、字符串的比较,字符串前缀后缀,字符串大小写转换,字符串的插入、添加、删除、提取、替换、遍历等常见操作,以及String与NNString的关系等内容。

第6章主要介绍Swift语言的Collection类型,包括数组、字典和集合类型等内容。

第7章主要介绍Swift语言的函数和闭包,包括函数的声明和调用、参数、返回值,函数类型、泛型和泛型函数,闭包的概念、表达式,尾随闭包和捕获值等内容。

第二部分为面向对象篇,共4章,主要介绍Swift语言面向对象的相关知识。

第8章主要介绍Swift语言的面向对象编程、枚举的定义和方法、值枚举和类型枚举等内容。

第9章主要介绍Swift的结构体,包括结构体的定义、属性、方法、构造器,以及结构体嵌套、可选链、扩展等内容。

第10章主要介绍Swift的类,包括类和结构体的区别、类的属性和方法、继承多态、重载、构造、类型检测,以及类对象的内存管理等内容。

第11章主要介绍Swift的协议与抽象类型,包括声明协议和遵守协议、协议的属性和方法、抽象类型等内容。

第三部分为错误处理篇,共1章,主要介绍Swift语言在实际开发应用中如何进行错误处理。

第12章主要介绍在使用Swift语言进行实际开发中遇到错误,如何来捕捉和处理错误等内容。

第四部分为Swift与Objective-C对比篇,共两章,主要介绍如何在Swift项目中调用Objective-C代码,以及Swift语言的优势。

第13章主要介绍Swift与Objective-C的区别,以及如何在Swift项目中调用Objective-C代码等内容。

第14章主要介绍Swift可以支持链式编程等内容的优势。

第五部分为项目实战篇,共两章,主要介绍如何使用Swift语言开发汽车商城项目。

第15章主要介绍iOS应用开发的一般流程,使用纯Swift代码来完成汽车商城项目等内容。

第16章主要介绍对iOS应用开发中的项目进行测试,我们以汽车商城项目为例,对该项目进行测试。

读者可以扫描如下二维码,观看本书配套视频。致谢

首先,感谢您选择本书,希望本书能够切实帮助您解决在实际开发中遇到的一些困难。

此外,感谢我们团队每一位成员的努力,这让我们用短短几个月的时间完成了本书的编写工作。

由于时间仓促,书中难免存在不妥之处。如果读者在使用本书时,发现差错或遇到问题,敬请批评指证,并请将指正内容发至本书编辑邮箱zhangshuang@ptpress.com.cn。博为峰51Code教研组第一部分基础语法篇第1章 Hello Swift第2章 变量和基本数据类型第3章 常见运算符和表达式第4章 流程控制语句第5章 字符和字符串第6章 Collection类型第7章 函数和闭包第1章Hello Swift1.1 Swift简介1.1.1 Swift语言简介

Swift 是一种新的编程语言,用于编写iOS、OS X和watch OS应用程序。Swift采用安全的编程模式并添加了很多新特性,这将使得编程更简单、灵活,也更有趣。基于成熟而且倍受喜爱的Cocoa和Cocoa Touch框架的Swift将重新定义软件开发。

Swift的开发从很久之前就开始了。为了给Swift打好基础,苹果公司改进了编译器、调试器和框架结构。我们使用自动引用计数(Automatic Reference Counting,ARC)来简化内存管理,在 Foundation和Cocoa的基础上构建现代化和标准化的框架栈。

Swift对于初学者来说也很友好。它是第一个既满足工业标准,又像脚本语言一样充满表现力和趣味的语言。它支持代码预览,这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行Swift代码,并实时查看结果。

Swift结合了现代编程语言的精华和工程师的智慧。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,可谓“鱼与熊掌兼得”。Swift既可以用于开发“hello, world”这样的简单程序,也可以用于开发一套完整的操作系统。Swift是编写iOS、OS X和watch OS应用程序的极佳语言,并将伴随着新的特性和功能持续演进。1.1.2 Swift语言开发平台

Swift语言开发平台基于Mac操作系统。Mac系统由苹果公司 自行研发,是基于UNIX内核的首个在商用领域成功的图形用户界面 操作系统。一般情况下,在普通PC 上无法安装操作Mac系统。Mac系统已经到了OS 10,代号为Mac OS X(X为10的罗马数字写法)。Mac系统非常可靠,它的许多特点和服务都体现了苹果公司 的理念。现行的最新的系统版本是OS X 10.11.5,本书中的代码都是基于Mac系统OS X 10.11.5。

2016年6月召开的苹果开发者大会正式将Mac操作系统OS X更名为Mac OS。1.1.3 Swift语言开发工具

Xcode是苹果公司向开发人员提供的集成开发环境,也是用于开发Mac OS X和iOS应用程序最快捷的方式。Xcode前身来自Next的Project Builder。

Mac OS X和iOS开发的主要工具是Xcode。在Xcode 3.1发布后,Xcode成为iPhone 软件开发工具包的开发环境。Xcode有正式版和Beat版(测试版)。我们可以从App Store直接下载并使用正式版,其性能比较稳定,测试版不能在App Store中下载。如果想下载使用Xcode beat版,我们可以在苹果开发者官网下载。在App Store和苹果开发者官网下载Xcode时都需要注册苹果开发者账号。

Xcode6及其以后的版本支持用Swift语言开发Mac OS X和iOS。Xcode6整合了苹果公司在苹果开发者大会上发布的新语言Swift 1.0版本,目前,Swift语言已经更新到了3.1版本。本书中的代码都是基于Swift 3.1编写的,开发环境为Xcode 8.2.1版。下面我们来学习如何安装和卸载Xcode。1.Xcode的安装

Xcode必须安装在Mac OS系统上,Xcode的版本与Mac OS系统的版本有着严格的对应关系。我们使用的Xcode 8.2.1必须要在Mac OS 10.11.5及其以上的系统中使用。

我们可以在苹果开发者官网上下载Xcode 8.2.1版。打开浏览器,输入网址,进入到如图1-1所示的最新Xcode下载入口。

单击首页下方的Develop栏下的“Downloads”,下载最新的Xcode。

如果你没有登录,单击“Downloads”,此时会弹出一个如图1-2所示的登录界面。如果已经注册过苹果开发者账号,我们可以直接输入;如果没有注册,则需要注册后才可以继续登录。图1-1 下载Xcode入口 图1-2 登录界面

输入苹果开发者账号和密码,单击“Sign In”,我们会进入到如图1-3所示的下载最新版本的Xcode的界面。

目前,最新版本的Xcode是Xcode 8.2.1,单击“Download”,我们就可以下载最新的Xcode。下载完成后,单击安装包,根据提示就可以在Mac电脑上安装Xcode 8.2.1。

我们也可以在App Store直接下载Xcode的最新版本Xcode 8.2.1。图1-3 下载Xcode 8.2.1界面2.Xcode的卸载

Xcode的卸载非常简单,在Mac OS的应用程序中直接删除即可。如图1-4所示,打开应用程序,右击“Xcode”弹出菜单,选择“移到废纸篓”,卸载Xcode应用。如果想彻底删除,继续清空废纸篓即可。图1-4 卸载Xcode1.1.4 Swift语言开发文档

对于初学者来说,学会在Xcode中使用API帮助文档是非常重要的。下面通过一个例子来介绍API帮助文档的用法。

在创建一个新工程时,可以看到在main.swift文件中的代码,具体如下。 1 | import Foundation 2 | print("Hello, World!")

如果想对print函数有更多的了解,我们可以查看帮助文档。如果想要简单地查看帮助信息,可以选中该方法,然后选择右侧的帮助检查器“?”;或者选中该函数并按住“option”键,在该函数下方会出现一个弹框,和右侧的帮助检查器中的内容完全一致,如图1-5所示。图1-5 Xcode快捷帮助检查器

在右侧的“?”,即Xcode快捷帮助检查器窗口中对该函数有详细的描述,包括使用的iOS版本、相关主题以及一些相关示例。

如果想要查询比较完整且全面的帮助文档,我们可以在选中print函数的同时,按住组合键“option”+“Shift”。这样就会打开一个Xcode API帮组搜索结果窗,如图1-6所示,右侧目录包括对Swift、Objective-C、JavaScript语言的简要介绍。在实际开发过程中,我们可以根据自己的需要,打开目录,查阅资料。图1-6 Xcode API帮助搜索结果窗口

当我们需要查询工程中没有的某个知识点的时候,可以在工程中选择“Xcode->Window-> Documentation and API Reference”,如图1-7所示,同样也能进入如图1-6所示的Xcode API帮助搜索结果窗口。图1-7 查找API1.2 Swift语言编程体验

使用Swift编程,有两种方式编写代码:使用Xcode的Playground,或创建工程运行Swift程序代码。本节以一个Swift程序为例,学习创建工程运行一个简单的Swift程序。1.2.1 Hello, 51Code程序

首先,新建一个工程。打开Dock栏的Xcode 8.0,选择“Create a new Xcode project”或单击桌面顶部的菜单“File->New->Project”,在打开的Choose a temple for new project界面中OS X下的Application中选择“Command Line Tool”工程模板。该模板主要用于Swift基础语法学习过程,如图1-8所示。

单击“Next”,如图1-9所示,在出现的界面中Product Name表示工程名,一般输入英文名称,为了清晰地表达项目的含义,这里我们将工程命名为“Hello 51Code”。Organization Name表示组织者名,可以输入个人或公司的名字,在这里我们输入“51code”。Organization identifier表示组织者域名,可以输入个人或公司的网址(网址需倒序书写),在这里我们输入“com.51code”。Language表示选择的语言,可选择的语言有Objective、C、C++、Swift,在这里我们选择“Swift”。

设置完相关的工程选项后,单击“Next”按钮,进入下一级界面,根据提示选择项目的保存位置。然后单击“Creat”按钮,将出现如图1-10所示的Xcode编辑界面。图1-8 选择模板图1-9 填写信息图1-10 Xcode编辑界面

在新建的Swift程序中,单击左侧工具栏中main.swift文件并写入如下代码。 1 | import Foundation 2 | print("Hello, World!") 3 | print("Hello, 51Code!")

在上述代码中,第1行import Foundation表示引入Foundation框架,至于后面引入何种框架,需要我们查找API来确定。

第2行print("Hello, World!")中的print是一个函数,能够将变量或常量输出到控制台,在此的功能是输出“Hello,World!”。

第3行代码与第2行代码的含义相同,实现输出“Hello, 51Code!”的功能。

最后单击项目左上角的三角符号或使用快捷方式“Command”+“R”运行程序,会在底部的控制器中打印出下列语句。Hello,World!Hello,51Code!1.2.2 演练利器Playground

在上一小节中,我们通过在Xcode中创建一个Mac OS X工程,来实现在控制台中打印出“Hello,World”。在学习Swift的初级阶段,我们还可以使用Playground工具来编写和运行Swift程序。下面我们在Playground中编写上述程序,看看会是什么效果?

首先,新建一个Playground工程,打开桌面的Xcode,如图1-11所示。图1-11 Xcode 8.0欢迎界面

选择“Get started with a playground”,进入如图1-12所示的界面,在Name栏中输入文件名“Hello 51Code”,在PlatForm中选择“iOS”。图1-12 输入文件名

然后单击“Next”按钮,弹出如图1-13所示的界面,这里是我们保存文件的对话框。图1-13 选择保存位置

保存完成后单击“Create”,这样我们就创建了一个名为“Hello 51Code”的playground文件,新建的playground界面如图1-14所示。图1-14 playground界面

在此文件中,我们仍然使用print函数输出“Hello 51Code!”,如图1-15所示。图1-15 输出“Hello 51Code!”

在这段代码中第3行和第5行是系统自带的代码,第3行代码用于导入UIKit框架,第5行代码定义了一个名为“str”的变量,并将其初始化为“Hello,playground”并且在该行的末尾出现了“Hello,playground”,第6行用print函数打印“Hello 51Code”,同样,在该行的末尾出现“Hello 51Code”,并有“\n”,表示换行。在底部的控制台也打印出了“Hello 51Code”。

通过上面这段代码,我们看到不需要运行,也能够输出结果。因此,Playground是一个非常适合Swift初学者的学习工具,但同时存在一个弊端,因为它不能运行程序,所以在实际项目开发中是不能使用Playground的。1.3  本章小结

通过学习本章内容,我们对Swift语言有了初步的认识,学习了Swift语言的开发平台Mac操作系统,以及开发工具Xcode。同时,学习了安装和卸载Xcode,以及使用Swift语言的API文档。最后,我们使用创建工程和Playground两种方式编写Swift程序代码,并了解了二者的区别和各自的优势。1.4 思考练习

1.解释说明使用Playground的好处。

2.使用Xcode新建工程,编写“Hello Swift!”程序。第2章变量和基本数据类型

本章将主要介绍常量和变量以及Swift语言的基本数据类型。常是指在使用过程中值不会发生变化的量,变量是指在使用过程中值会发生变化的量。实际上,常量是一种特殊的变量。Swift语言中的数据类型主要包括整型、浮点型、布尔型、字符串型、元组型和可选型。2.1 Swift语言基础语法

任何一种计算机语言都离不开标识符和关键字,下面我们来详细介绍Swift语言的标识符和关键字。2.1.1 标识符

标识符是为变量、常量、方法、函数、枚举、结构体、类和协议等指定的名字。构成标识符的字母均有一定的规范,Swift语言中标识符的命名规范如下。(1)标识符区分大小写,swift与Swift是两个不同的标识符。(2)标识符可以以下划线(_)或者字母开头,但不能是数字。(3)标识符中其他字符可以是下划线(_)、字母或数字。

例如,id、userName、User_Name、_name、身高均为合法的标识符,而2mail以数字开头则为非法的标识符。 注意 Swift中的字母采用Unicode编码。Unicode为统一编码制,

它包含了亚洲文字编码,如中文、日文、韩文等字符,以及

聊天工具中使用的表情符号,这些符号在Swift中都可以使

用。关于Unicode编码会在第5章详细讲解。2.1.2 关键字

关键字是一些具有特殊用途的单词,它类似于标识符的保留字符序列,但不能用作标识符。在定义标识符时,要避免标识符合关键字相同,否则将引起错误。常见的关键字如下所示。

class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var、break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while、Nil、nil、as、dynamicType、is、new、super、self、Self、Type、associativity、didSet、willSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、rightset、unowned、unowned(safe)、unowned(unsafe)、weak、nil、Nil。

对于上述关键字,目前我们没有必要知道它们的所有含义。但是要注意:在Swift中,关键字是区分大小写的,因此,class和Class是不同的,当然,Class不是Swift的关键字。2.1.3 表达式

表达式是程序代码的重要组成部分,在Swift中,表达式由操作数和运算符组合而成。示例代码如下。 a + b 9 - 2

类似于上述形式的,我们就称为表达式。表达式不能被直接使用,可以通过print函数打印出来,例如: print(9-2)

输出结果:72.1.4 语句

语句是指有返回值的表达式,例如: c = a + b

在Swift语言中,一条语句结束后可以不加分号,也可以添加分号。但是当多条语句写在同一行时,必须要通过加分号来区别语句,例如: c = a + b ; x + y = z

接下来我们来看对语句的注释。在Swift程序中有两类注释:单行注释(//)和多行注释(/*...*/)。1.单行注释

单行注释可以注释整行或者一行中的一部分,一般不用于连续多行的注释文本。单行注释的写法为“//”。当然,它也可以用来注释多行的代码段,以下是两种风格的注释例子。

方式1:a + b = c // 注释

方式2:// 注释 a + b = c

方式3://a + b = c

方式1是将“//”写在语句的后面,在“//”后写对这条语句的解释。

方式2是将“//”写在语句的上面,在“//”后写对下面这条语句的解释。

方式3是在语句前加“//”,表示将这段代码隐藏,不再使用。

在Xcode中对连续多行的注释文本可以使用快捷键,方法是选择多行,然后按住“command+/”键进行注释,去掉注释也是按住“command”+“/”键。2.多行注释

一般用于连续多行的注释文本,也可以进行嵌套注释,写法为“/*…*/”。这里我们通过一段代码来介绍多行注释,大家不需要理解这段代码的含义。 1 | /* var a = 10 2 | var b = 5 3 | if a == b { 4 | print("a = b") 5 | } 6 | /* 7 | if a != b { 8 | print("a!= b") 9 | } 10 | */ 11 | if a > b{ 12 | print("a > b") 13 | } 14 | */

在上述代码中,第1行的“/*”和第14行的“*/”是一组多行注释符号,表示从第1行到第14行为注释内容。第6行的“/*”与第10行的“*/”是嵌套注释,表示从第6行到第10行为代码注释。只有Swift语言有多行嵌套注释,在其他语言中是没有的。2.2 常量和变量2.2.1 常量

在声明和初始化变量时,在标识符的前面加上关键字let,可以把该变量指定为一个常量。下面我们通过一个例子来介绍如何定义一个常量。 1 | let number = 16

上述代码表示声明一个名为number的常量。常量只能在初始化时被赋值,如果我们再次给number赋值,程序会报错。

一般来说,常量按照驼峰法的命名原则进行命名,常量名的第一个单词的首字母小写,其他单词首字母大写,示例代码如下。 1 | let numberOfFive = 5 2 | let numberOfFive:Int = 5

在上述代码中,第1行代码定义了一个值为5的常量。这里我们没有指定数据类型,Swift可以根据等号右边常量的值自动推断出该常量的数据类型,称为隐式推断。第2行代码,我们在常量名后面加“:”表示指定数据类型,“:”后面的Int表示该常量定义的数据类型,这种写法称为显式推断。这里我们不需要知道Int的含义,只知道它表示一种数据类型即可。在下一节数据类型中,会为大家详细讲解。2.2.2 变量

在Swift中声明变量,就是在标识符的前面加上关键字var,示例代码如下。var score = 0.0

该语句声明score变量,并将其初始化为0.0。如果在一个语句中声明了多个变量,那么所有的变量都具有相同的数据类型,示例代码如下。var x = 10, y = 20

在多个变量的声明中,我们也能指定不同的数据类型。var x = 10, y = "hello"

其中x为整型,y为字符串类型。

常量的命名规范和变量的命名规范一致,在定义变量时,如果没有声明指定的数据类型,那么也可以进行类型自动推断。2.3 数据类型

Swift中的数据类型包括:整型、浮点型、布尔型、字符串型、元组型、集合、枚举、结构体和类等。

这些类型按照参数传递方式的不同可以分为值类型和引用类型。值类型是在赋值或给函数传递参数时,创建一个副本,把副本传递过去,这样在调用函数过程中不会影响原始数据。引用类型是在赋值或给函数传递参数时,把本身数据传递过去,这样在调用函数过程中会影响原始数据。

在上述数据类型中,整型、浮点型、布尔型、字符串型、元组型、集合、枚举和结构体属于值类型,而类属于引用类型。本章将重点介绍整型、浮点型、布尔型和元组型等基本数据类型。2.3.1 布尔型

布尔(Bool)型只有两个值:true和false。实例代码如下。1 | var isTure = true2 | var isFalse: Bool = false

在上述代码中,第1行代码定义了isTrue变量并赋值为true,这里我们没有指定isTrue的数据类型,Swift可以根据等号右边的值自动推断类型。第2行代码为变量isFalse指定数据类型为Bool类型,即布尔类型,数据类型的首字母大写。在Swift 3中,所有的Bool类型都重新命名为isxxx,因此我们的自定类中Bool属性的命名也应体现这个规则。

布尔表达式通常用于if语句的判断。if语句用于条件的判断,我们会在第4章流程控制语句中详细向大家讲解,在此只做简单了解即可。1 | var isTure = true2 | if isTure{3 | print("This is true")4 | }else{5 | print("This is false")6 | }2.3.2 整型

Swift提供8、16、32、64位形式的有符号及无符号整数,这些整数类型的命名规范如表2-1所示。表2-1 数据类型数据名称说明类型有符号8位整—Int8型有符号16位—Int16整型有符号32位—Int32整型有符号64位—Int64整型平台相关有在32位平台,Int与Int32宽度一致 在64位Int符号整型平台,Int与Int64宽度一致无有符号8位—UInt8整型UInt1无有符号16—6位整型UInt3无有符号32—2位整型UInt6无有符号64—4位整型平台相关无在32位平台,UInt与UInt32宽度一致 在64UInt符号整型位平台,UInt与UInt64宽度一致

除非要求固定宽的整型,一般我们只使用Int或UInt,这些类型能够与平台保持一致,下面我们来看一个整型示例。1 | import Foundation2 | print("UInt 范围:\(UInt.min)~\(UInt.max)")3 | print("Int 范围:\(Int.min)~\(Int.max)")

输出结果:UInt 范围:0~18446744073709551615Int 范围:-9223372036854775808~9223372036854775807

上述代码是通过整数的min和max属性计算数据类型的范围。min属性获得当前整数的最小值,max属性获得当前整数的最大值。同理,可以用与例子中一致的写法,来获取其他整形数据的范围。

整型数据同布尔型数据一样,在不声明数据类型时,Swift语言会自行对该数据类型进行推断。整型数据采用进制数作为其表示方式。

我们为一个整数变量赋值十进制数、二进制数、八进制数、十六进制数,它们的表示方式如下。

二进制数,以0b为前缀,第一个字符是阿拉伯数字0,不要误以为是字母o,第2个字符是小写字母b,必须小写。

八进制数,以0o为前缀,第一个字符是阿拉伯数字0,第二个字符是小写字母o,必须小写。

十六进制数,以0x为前缀,第一个字符是阿拉伯数字0,第二个字符是小写字母x,必须小写。

例如,下面语句都是将整型数据10赋给常量。 1 | let decimalInt = 10 2 | let binaryInt = 0b1010 3 | let octalInt = 0o12 4 | let hexadecimalInt = 0xA

在上述代码中,第1、2、3、4行代码分别用十进制、二进制、八进制、十六进制表示整形数据10。

除此之外,在Swift中,为了阅读的方便,对于数值较大的整数可通过添加多个零或下划线的方法提高可读性,且不会影响实际值。例如: 1 | var myMoney = 3360_000 2 | var phone = 136_2456_4678

第1行代码定义了整型变量myMone,并赋值为3360000。第2行代码136_2456_4678是一个手机号码,采用下划线分隔,更容易阅读。一般是每隔3位加一个下划线。2.3.3 浮点型

浮点型主要用来存储小数数值,也可以用来存储范围较大的整数。它分为浮点数(Float)和双精度浮点数(Double)两种,双精度浮点数所使用的内存空间比浮点数多,可表示的数值范围也比较大,精度也更高。Float表示32位浮点数,在浮点数较小时使用。Double表示64位浮点数,如果没有明确指定类型,一般默认为Double类型。

下面我们来看一个浮点型示例。 1 | var number1:Float = 300.5; 2 | var number2:Double = 360.5; 3 | let pi = 3.14159

例子中第1行代码明确指定变量number1是Float类型,第2行代码明确指定变量number2是Double类型,第3行常量pi没有明确数据类型,我们给它赋值为3.14159,Swift编译器会自动推断出它是Double类型。这是因为Double是系统默认浮点型,如果我们一定要使用Float类型,那么需要在声明时明确指定Float类型。

如果小数点位数比较多,为了方便阅读,浮点数也可以像整型数据一样,采用下划线的表示方法,示例如下。let num = 0.003_456_653

浮点型数据和整型数据一样都有自己的数字表达方式,也可以使用进制数表示。如果采用十进制表示指数,需要用e(大写或小写)来表示幂。例如:var myMoney = 3.005 * e2var num = 0.5 * e-42.3.4 字符串型

在Swift中,字符串的类型是String,首先我们来学习如何创建一个字符串。定义空字符串有两种方式: 1 | var emptystr = "" 2 | var emptystr = String()

利用isEmpty方法判断字符串是否为空,示例代码如下。 1 | var emptystr = "" 2 | if emptystr.isEmpty{ 3 | print("str是空字符串") 4 | }

接下来我们要创建不可变字符串和可变字符串,Swift语言通过为字符串变量声明为let、var来实现不可变字符串、可变字符串,示例代码如下。 1 | let str:String = "hello" 2 | var varyStr = "hello" 3 | varyStr = varyStr + "你好" 4 | print("varyStr:\( varyStr)")

输出结果:str:hello你好

在上述例子中,第1行代码定义String类型的常量str。第2行代码定义了变量varyStr,这里没有指定varyStr的数据类型。由于Swift能够对数据类型进行自动推断,根据varyStr的值“hello”,系统可以自动推断出varyStr为String类型。第3行代码用“+”对str进行了追加。第4行代码是打印出varyStr的值。在打印时需要插入常量、变量或其他类型的数据时,需要使用反斜杠,例如第4行代码print("str:(str)")中的“\str”。2.3.5 数据类型的转换

Swift是一种安全的语言,对于类型的检查非常严格,不同类型之间不能随意转换。本节我们介绍数据类型之间的转换。1.整型之间的转换

整型之间有两种转换方式:(1)从小范围数到大范围数转换是自动的。(2)从大范围数到小范围数需要强制类型转换,有可能造成数据精度的丢失。

下面我们通过一些例子来学习整型之间的转换。 1 | let num1:UInt8 = 10 2 | let num2:UInt16 = 100 3 | let sum = num1 + num2 4 | let sum1 = UInt16(num1) + num2 //安全 5 | let sum2 = num1 + UInt8(num2) // 不安全

在上述例子中,第1行和第2行代码声明和初化了两个常量num1和num2,第3行代码实现相加,将它们相加的值赋给sum。程序出现了编译错误,错误为:Binary operator '+' cannot be applied to operands of type 'UInt8' and 'UInt16'

根据提示,我们知道原因是num1是UInt8类型,而num2是UInt16类型,二者的数据类型不同,不能直接进行运算。

我们可以有两种方法实现num1和num2相加:(1)第4行代码将UInt8的num1转为UInt16类型。这里是从小范围数转换为大范围数,这种转换是安全的。(2)第5行代码是把UInt16的num2转换为UInt8类型。从大范围数转换为小范围数,这种转换是不安全的,如果转换的数比较大,会造成精度的损失。如果num2的值很大,超过了UInt8表示的最大值,这样就会出现报错。2.整型与浮点型之间的转换

整型与浮点型之间的转换与整型之间的转换类似,因此我们将上一节的代码修改如下。 1 | let num1:Float = 8.9 2 | let num2:UInt16 = 210 3 | let sum = num1 + num2 4 | let sum1 = num1 + Float(num2) //安全 5 | let sum2 = UInt16(num1) + num2 // 不安全

在上述例子中,第1行代码常量num1类型是Float类型,第2行代码常量num2还是UInt16类型,第3行代码直接将num1和num2进行相加,结果有编译错误。错误原因仍然是num1和num2的数据类型不同,不能直接运算。

第4行代码将UInt16类型的num2转换为Float类型,这种转换是最安全的。第5行代码将Float类型的num1变量转换为UInt16类型,这种转换首先会导致小数被截掉。另外,如果num1的数值很大,会导致运行异常,这与整型之间的转换是类似的。3.整型与布尔型之间的转换 1 | let num1 = 12 2 | let num2 = 0 3 | let num3 = -3 4 | let a1 = Bool(num1) 5 | let a2 = Bool(num2) 6 | let a3 = Bool(num3) 7 | print("a1的值:\(a1),a2的值:\(a2),a3的值:\(a3)") 8 | let b1 = true 9 | let b2 = false 10 | let value1 = Int(b1) 11 | let value2 = Int(b2) 12 | print("value1的值:\( value1), value2的值:\( value1)")

输出结果:a1的值:true,a2的值:false,a3的值:truevalue1的值:1,value2的值:0

在上述例子中,只有当整型数据值为0时,转化为布尔型为false,其他都为true。布尔型的值为true时转换为整型数据1,布尔型的值为false时转换为整型数据0。4.整型与字符串型之间的转换 1 | let num = 12 2 | let a = String(num) 3 | print("a的值:\(a) ") 4 | let str = "123" 5 | let value = Int(str) 6 | print("value的值:\( value) ")

输出结果:a的值:12 value的值:123

此时a的数据类型是字符串型,value的数据类型为整型。只有包含数字的字符串数据才可以使用Int方法转换为整型数据。

关于其他数据类型间的转换同整型数据转换为其他数据类型方法一致,这里就不再赘述了。2.3.6 元组型

在Swift语言中,元组型是多个值组成的复合值类型,能够便于管理和计算。元组型由N个任意类型的数据组成(N≥0),组成元组型的数据可以称为“元素”。

现在我们来定义一个用来表示时间的元组time。它包括年(year)、月(month)、日(day),示例代码如下。 1 | let time1 = (2016,5,4) 2 | let time2 = (year:2016,month:5,day:4)

在上述例子中,第1行代码定义了一个名文time1的元组,用来表示年月日。第2行代码定义了名为time2的元组,同样是表示年月日。但这两种写法是有区别的,第1行代码定义的time1元组,可读性不是很强,大家未必能猜测出是表示年月日。但是第2行代码定义的time2元组,通过(year:2016,month:5,day:4),我们可以很直观地知道year是表示年,month是表示月,day是表示天。这样代码的可读性会更好,建议大家使用这种表示方法来定义元组。

如果想访问元组中的数据,我们可以使用下标方式,例如0,1,……以此类推,也可以通过元素名来访问元组中的数据。这里我们以元组time1和time2为例: 1 | let time1 = (2016,5,4) 2 | print("\(time1.0)年\(time1.1)月\(time1.2)日") 3 | let time2 = (year:2016,month:5,day:4) 4 | print("\(time2.0)年 \(time2.1)月, \(time2.2)日") 5 | print("\(time2.year)年\(time2.month)月\(time2.day)日")

输出结果:2016年5月4日2016年5月4日2016年5月4日

在上述例子中,第1行代码定义了time1元组,第2行代码通过下标方式访问元组中的值,例如time1.0表示访问元组的第一个值。第3行代码定义了time2元组,第4行代码同样是采用下标方式访问元组中的每一个元素,第5行代码通过元组的元素名访问元组的值,例如time2.year访问元组的第一个值。

此外我们也可以把一个元组的内容分解成单独的常量和变量,仍以time2这个元组为例。 1 | let (year,month,day) = time2 2 | print("\(year)年\(month)月\(day)日")

输出结果同上例。

如果你只需要一部分元组值,分解时可以把要忽略的部分用下划线(_)标记,示例如下。 1 | let (year,month,_) = time2 2 | print("\(year)年\(month)月: ")

输出结果:2016年5月2.3.7 可选型

有时我们使用一个变量或常量,但不确定它是否已储存值。此时,我们需要将这个常量或变量设置为可选型。使用可选型是为了处理可能缺失值的情况。可选型是Swift中全新的数据类型,它的特点是可以有值,也可以没有值。没有值时,就是 nil。只需要在数据类型后面加上问号(?)就可以定义一个可选型的数据,示例代码如下。 1 | var str: String? 2 | print(str)

输出结果:nil

这里我们只声明str为一个可选型的字符串,但没有为它赋值,所以打印出来是nil。1.可选绑定

可选型可以用于判断,即我们在程序中经常会使用到的可选绑定。可以使用 if 语句来判断一个可选型是否包含一个值。如果包含一个值,结果为 true,否则为false。 1 | var myString:String? = nil 2 | if myString != nil { 3 | print(myString) 4 | }else{ 5 | print("myString has nil value") 6 | }

输出结果:myString has nil value

在上述代码中,第1行代码定义了String类型的可选值myString,并将其初始化为nil。通过if语句对可选型进行判断,如果myString不为空,则输出myString,否则输出myString has nil value。

这种可选型在if或while语句中赋值并进行判断的写法,叫作可选绑定。2.强制拆包

如果我们能确定可选型中一定有值,那么在读取它时,可以在可选型的后面加一个感叹号(!)来获取该值。这种感叹号的表示方式称为可选值的强制拆包,代码如下所示。 1 | var myString:String? 2 | myString = "Hello, Swift!" 3 | if myString != nil { 4 | print(myString) 5 | }else{ 6 | print("myString has nil value") 7 | }

输出结果:Optional("Hello, Swift!")

现在我们使用拆包来获取正确的值。 1 | var myString:String? 2 | myString = "Hello, Swift!" 3 | if myString != nil { 4 | print( myString! ) 5 | }else{ 6 | print("myString has nil value") 7 | }

输出结果:Hello, Swift!

通过上面的例子,我们看到在myString后面加上(!)可以实现对可选型的拆包。3.隐式拆包

为了能够方便地访问可选型,我们可以将可选型后面的问号(?)换成感叹号(!),这种可选型在拆包时,在变量或常量后面不加感叹号(!)的表示方式称为隐式拆包,代码如下所示。 1 | var myString:String! 2 | myString = "Hello, Swift!" 3 | if myString != nil { 4 | print( myString) 5 | }else{ 6 | print("myString has nil value") 7 | }

在上述代码中,在第1行定义的字符串变量myString的数据类型String后面使用感叹号(!),而不是问号(?),在拆包时,变量或常量后面不用加感叹号(!),这就是隐式拆包。隐式拆包的变量或常量使用起来就像普通变量或常量一样,你完全可以把它看成是普通的变量或常量。2.4 本章小结

本章主要向大家讲解了Swift语言中的常量、变量以及基本数据类型。我们介绍了如何使用常量和变量,同时也学习了Swift语言中的整型、浮点型、布尔型、字符串型、元组型和可选型的使用。2.5 思考练习

1.使用可选型有什么好处?

2.在什么情况下使用元组型?

3.定义一个整型数据,并将它转换为字符串。第3章常见运算符和表达式

本章主要为大家介绍Swift语言中的一些基本运算符,包括算术运算符、关系运算符、逻辑运算符、关系运算符和范围运算符等。3.1 算术运算符

Swift中的算术运算符用来进行整型和浮点型数据的算术运算。二元运算符如表3-1所示。表3-1  二元运算符运算符运算例子结果++44取正−取负−3−3+加4+59−减6−33乘2*36*/除8/42%取余9%21

算术运算符看上去比较简单,也很容易理解,但在实际使用时需要注意以下问题。(1)进行四则混合运算时,运算顺序遵循数学中“先乘除后加减”的原则。(2)当有浮点数参与运算时,运算结果的数据类型总是浮点型。例如,8/3.5结果是2.28571428571429,Float类型。(3)取余运算在程序设计中具有广泛的应用,例如,在判断一个数是奇数还是偶数的方法时,要求这个数字除以2的余数是1还是0。取余运算取决于%左边的数,而与%右边的数无关,例如,9 % 4 =1,−9 % 4 =−1,9 % −4 = 1。3.2 赋值运算符

赋值运算符的作用是将常量、变量或表达式的值赋给某一个变量。下面例举Swift语言中赋值运算符及其用法,具体说明见表3-2。表3-2  赋值运算符运算符运算例子结果=a = 10,b = 5a = 10,b = 5赋值+=加赋值a += ba = a + b−=减赋值a −= ba = a − b乘赋值a *= ba = a * b*=/=除赋值a /= ba = a / b%=a %= ba = a % b取余赋值3.3 关系运算符

关系运算符用来比较两个表达式的大小,它的结果是true或false,即布尔型数据。如果表达式成立,结果为true,否则为false。关系运算符共有8种:==、!=、>、<、>=、<=、===和!==,具体说明见表3-3。表3-3  关系运算符运算符名称例子结果==等于a==4false!=a!=4true不等于>大于a > 4true<小于a < 4false>=大于等于a >= 4false<=小于等于a <= 4false3.4 逻辑运算符

逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体说明见表3-4。表3-4  逻辑运算符运算名称例结果符子逻辑a不为0时,表达式为true;a为0时,表达式!a!非为false逻辑a&&&&a和b全为true时,表达式才为trueb与逻辑||a||ba和b最少有一个为true时,表达式为true或

逻辑运算符对象必须是布尔型。3.5 三元运算符

三元运算符的特殊在于它是有3个操作数的运算符,它的原型是“问题?答案1:答案2”。

三元运算符能够简洁地表达根据问题成立与否,做出二选一的操作。如果问题成立,返回答案1的结果;如果不成立,返回答案2的结果。

下面我们来看一个三元运算符的示例:计算表格行高。如果有表头,那行高应比内容高度要高出50像素;如果没有表头,只需高出20像素。 1 | let contentHeight = 40 2 | let hasHeader = true 3 | let rowHeight = contentHeight + (hasHeader ? 50 : 20)

输出结果:rowHeight = 90

三元条件运算能够很方便地表达二选一的选择。需要注意的是,过度使用三元条件运算会将简洁的代码变成复杂难懂的代码,要避免在一个组合语句使用多个三元条件运算符。3.6 Nil Coalescing运算符

Nil Coalescing运算符的原型是“答案1??答案2”。我们可以用一句代码表示Nil Coalescing运算符: 1 | let c = a ?? b

使用该运算符必须满足以下两个条件:(1)a必须是可选类型的。(2)b的类型必须和a解包后的值类型一致的。

符合这两个条件后,第1行代码表示的就是c的值是a或b中的一个。当a解包后的值不为nil时,将a的值赋值给c;当a解包后的值为nil时,将b的值赋值给c。

我们可以用三元运算符来更清晰地理解Nil Coalescing运算符。它可以表示为: 1 | let c = a != nil ? a ! : b

在上面的代码中,当a的值不等于nil时,将a解包后的值赋值给c,否则将b的值赋值给c。 1 | var a:String? 2 | let b = "str" 3 | var c = a ?? b 4 | print(c)

输出结果:str

在上述代码中,a的值为nil,所以把b的值赋值给c,最后c的值就是str。3.7 复合表达式

学习完算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符以及区间运算符,本节我们来学习复合表达式,示例代码如下: 1 | let a = 10 2 | let b = 18 3 | let c += b * ((a > b) ? 10 :20) 4 | print(c)

输出结果:360

在上述代码中,我们将算术运算符、复合赋值运算符、关系运算符以及条件运算符结合在一起,形成了一个复合表达式。3.8 本章小结

本章我们学习了Swift语言中的常见运算符和表达式,包括算术运算符、复合赋值运算符、逻辑运算符、关系运算符、条件运算符以及区间运算符,最后我们通过复合表达式将这些常见运算符综合起来使用。3.9 思考练习

编写一个Swift程序,定义a、b、c三个值,输出其中最大的数。第4章流程控制语句

程序设计中的控制语句有3种,分别为顺序、分支和循环语句。Swift程序通过控制语句来执行程序流,完成相关任务。程序流由若干个语句组成,语句可以是一条单一的语句,也可以是用大括号({})括起来的复合语句。Swift中的控制语句有以下3类。(1)循环语句:for-in、while、repeat-while。(2)条件语句:if、switch。(3)控制转移语句:break、continue、fallthrough。4.1  循环语句

循环语句指让程序从某个位置开始,连续不断地重复执行同一个操作。Swift语言支持3种循环构造类型:for、while、repeat-while。for和while循环是在执行循环体之前测试循环条件,而repeat-while是

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载