fbpx

[email protected]

购物车

 查看订单

  • 我的帐户
东东购 | EasternEast
  • 中文书店
    • 畅销排行榜
      • 小说 畅销榜
      • 童书 畅销榜
      • 外语畅销榜
      • 管理畅销榜
      • 法律畅销榜
      • 青春文学畅销榜
    • 热门分类
      • 社会小说
      • 成功/励志 畅销榜
      • 人物传记
      • 大陆原创
      • 绘本童书
      • 影视小说
    • 文学推荐
      • 文集
      • 戏剧
      • 纪实文学
      • 名家作品
      • 民间文学
      • 中国现当代随笔
    • 新书热卖榜
      • 小说 新书热卖榜
      • 青春文学 新书热卖榜
      • 童书 新书热卖榜
      • 管理 新书热卖榜
      • 成功/励志 新书热卖榜
      • 艺术 新书热卖榜
  • 精选分类
    • 小说
    • 保健养生
    • 烹饪/美食
    • 风水/占卜
    • 青春文学
    • 童书
    • 管理
    • 成功/励志
    • 文学
    • 哲学/宗教
    • 传记
    • 投资理财
    • 亲子家教
    • 动漫/幽默
    • 法律 Legal
    • 经济 Economics
    • 所有分类
  • 关于东东
  • 帮我找书
搜索
首页计算机/网络程序设计Swift从入门到精通

Swift从入门到精通

活学活用Swift 3+iOS10+Xcode 8开发App。赠送13小时本书源代码下载iOS UI开发视频教程

作者:张益珲 出版社:清华大学出版社 出版时间:2017年05月 

ISBN: 9787302469209
年中特卖用“SALE15”折扣卷全场书籍85折!可与三本88折,六本78折的优惠叠加计算!全球包邮!
trust badge

EUR €48.99

类别: 程序设计 SKU:5d875d125f98494bcc15163b 库存: 有现货
  • 描述
  • 评论( 0 )

描述

开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302469209丛书名: 移动开发丛书

产品特色
编辑推荐
本书免费赠送编者精心录制的Objective-C iOS界面设计视频教程,本视频教程共包括36个教学片段,播放时长超过13个小时。本书由专业的iOS开发工程师根据Swift 3精心编撰,兼备核心语法、编程技巧与应用实践3大主题,是一本使用Swift 3进行移动应用开发的实践性教程,通过学习本书,读者不仅能够掌握Swift语言,更重要的是可以使用Swift开发出一款具有商业价值的App产品。 
内容简介
本书由专业的iOS开发工程师根据Swift 3精心编撰,兼备核心语法、编程技巧与应用实践3大主题。*部分从Xcode开发工具及Swift学习环境的搭建开始,重点介绍Swift 3的语言特性和应用场景,并提供了大量编程练习,帮助读者尽快掌握Swift语言的精髓。第二部分介绍Swift开发iOS应用的基本技能,包括独立UI控件的应用、视图界面逻辑的开发、动画与布局技术、网络与数据处理技术等,旨在带领读者掌握独立开发一款iOS 应用程序的能力。第三部分为应用部分,这部分安排了3个实战项目(简易计算器、生活记事本、中国象棋游戏),项目的安排有简到难,旨在全面锻炼读者的实际开发能力,使用Swift进行开发实践。
通过本书的学习,读者可以轻松地掌握使用Swift语言开发一款iOS软件从理论到实践的全部技术细节。本书适合使用Swift 3开发iOS应用的新手,有Objective-C基础想学习Swift 3的iOS开发人员,也很适合用作培训机构与大中专院校移动开发课程的教学参考书。
作者简介
张益珲   软件开发工程师,拥有多年iOS开发经验,曾开发iOS平台系列——游戏疯狂越狱1~2、应用物通配货软件、VIPExam考试库、证券财经软件等,现就职于中国唯品会。
目  录

第1部分  Swift语言基础

第1章  学习环境的搭建 3

1.1  申请个人AppleID账号 3

1.2  下载与安装Xcode开发工具 4

1.3 
Xcode开发工具简介 5

1.4  使用Playground进行Swift代码演练 9

第2章  量值与基本数据类型 10

2.1  变量与常量 10

2.1.1 
变量与常量的定义和使用 11

2.1.2 
变量和常量的命名规范 12

2.2  关于注释 13

2.3  初识基本数据类型 13

2.3.1 
数学进制与计算机存储原理 14

2.3.2 
整型数据 14

2.3.3 
浮点型数据 15

2.3.4 
布尔型数据 16

2.4  两种特殊的基本数据类型
16

2.4.1 
元组 16

2.4.2 
可选值类型 17

2.5  为类型取别名 20

2.6  练习及解析 20

第3章  字符、字符串与集合类型
21

3.1  字符串类型 21

3.1.1 
进行字符串的构造 21

3.1.2 
字符串的组合 22

3.2  字符类型 23

3.2.1 
字符类型简介 23

3.2.2 
转义字符 24

3.3  字符串类型中的常用方法
24

3.4  集合类型 26

3.4.1 
Array数组类型 27

3.4.2 
Set集合类型 30

3.4.3 
Dictionary字典类型 33

3.5  练习及解析 35

第4章  基本运算符与程序流程控制
38

4.1  初识运算符 38

4.1.1 
赋值运算符 39

4.1.2 
基本算术运算符 39

4.1.3 
基本逻辑运算符 40

4.1.4 
比较运算符 41

4.1.5 
条件运算符 41

4.2 
Swift语言中两种特殊的运算符 42

4.2.1 
空合并运算符 42

4.2.2 
区间运算符 43

4.3  循环结构 43

4.3.1 
for-in循环结构 43

4.3.2 
while与repeat-while条件循环结构 44

4.4  条件选择与多分支选择结构
46

4.4.1 
if与if-else条件选择结构 46

4.4.2 
switch-case多分支选择结构 46

4.5 
Swift语言中的流程跳转语句 49

4.6  练习及解析 52

第5章  函数与闭包技术 56

5.1  函数的基本应用 56

5.1.1 
函数的创建与调用 57

5.1.2 
关于函数的参数名 58

5.1.3 
函数中参数的默认值、不定数量参数与inout类型参数 59

5.2  函数的类型与函数嵌套 61

5.3  理解闭包结构 63

5.3.1 
闭包的语法结构 63

5.3.2 
通过实现一个排序函数来深入理解闭包 63

5.4  将闭包作为参数传递时的写法优化 66

5.5  后置闭包、逃逸闭包与自动闭包 67

5.6  练习及解析 68

第6章  高级运算符与枚举 72

6.1  位运算符与溢出运算符 72

6.1.1 
位运算符的应用 72

6.1.2 
溢出运算符 74

6.2  运算符的重载与自定义 74

6.2.1 
重载运算符 74

6.2.2 
自定义运算符 76

6.3  运算符的优先级与结合性
77

6.4  枚举类型的创建与应用 79

6.5  枚举的原始值与相关值 81

6.5.1 
枚举的原始值 81

6.5.2 
枚举的相关值 82

6.5.3 
递归枚举 83

6.6  练习及解析 86

第7章
 类与结构体 88

7.1  类与结构体的定义 88

7.1.1 
结构体 88

7.1.2 
类 90

7.2  设计一个交通工具类 91

7.3  开发中类与结构体的应用场景
94

7.4  练习及解析 95

第8章  属性与方法 97

8.1  存储属性与计算属性 97

8.1.1 
存储属性的意义及应用 97

8.1.2 
计算属性的意义及应用 100

8.2  属性监听器 102

8.3  实例属性与类属性 103

8.4  实例方法与类方法 104

8.4.1 
实例方法的意义与应用 104

8.4.2 
类方法 105

8.5  下标方法 106

8.6  练习及解析 108

第9章  构造方法与析构方法 109

9.1  构造方法的设计与使用
109

9.2  指定构造方法与便利构造方法
112

9.3  构造方法的继承关系 113

9.4  构造方法的安全性检查
115

9.5  可失败构造方法与必要构造方法 116

9.6  析构方法 117

9.7  练习及解析 118

第10章  内存管理与异常处理 120

10.1 
自动引用计数 120

10.2 
循环引用及其解决方法 123

10.3 
闭包中的循环引用 128

10.4 
异常的抛出与传递 129

10.5 
异常的捕获与处理 130

10.6 
延时执行结构 131

10.7 
练习及解析 132

第11章  类型转换、泛型、扩展与协议
133

11.1 
类型检查与转换 133

11.1.1 
Swift语言中的类型检查 134

11.1.2 
Swift语言中的类型转换 134

11.2 
Any与AnyObject类型 135

11.3 
泛型 137

11.3.1 
初识泛型 137

11.3.2 
对泛型进行约束 139

11.4 
扩展与协议 141

11.4.1 
使用扩展对已经存在的数据类型进行补充 141

11.4.2 
协议的特点与应用 143

11.4.3 
协议与扩展的结合 146

第2部分  iOS开发基础

第12章  UI控件与逻辑交互(1) 148

12.1 
iOS项目工程简介 148

12.1.1 
创建iOS项目工程 148

12.1.2 
运行个iOS程序 150

12.2 
标签控件——UILabel 151

12.2.1 
使用代码创建一个UILabel控件 152

12.2.2 
自定义UILable控件的展示效果 152

12.2.3 
定义更加丰富多彩的UILabel控件 154

12.3 
按钮控件——UIButton 155

12.3.1 
创建UIButton按钮控件 155

12.3.2 
为按钮添加触发事件 157

12.3.3 
为UIButton添加自定义图片 158

12.4 
图片显示控件——UIImageView 160

12.4.1 
图片类UIImage 160

12.4.2 
使用UIImageView进行图片的展示 160

12.4.3 
使用UIImageView播放动画 161

12.5 
文本输入框控件——UITextField 162

12.5.1 
创建文本输入框控件 162

12.5.2 
为UITextField设置左右视图 164

12.5.3 
UITextField控件的代理方法 165

12.6 
开关控件UISwitch 168

12.7 
分页控制器——UIPageControl 169

12.8 
分部控制器——UISegmentedControl 170

12.8.1 
创建分布控制器控件 170

12.8.2 
UISegmentedControl控件中按钮的增删改操作 171

12.8.3 
关于UISegmentedControl控件中按钮的尺寸问题 172

第13章  UI控件与逻辑交互(2) 173

13.1 
滑块控件UISlider 173

13.1.1 
UISlider控件的创建与设置 173

13.1.2 
UISlider控件的外观自定义与用户交互 174

13.2 
活动指示器UIActivityIndicatorView 176

13.3 
进度条控件UIProgressView 177

13.4 
步进器UIStepper 178

13.5 
选择器控件UIPickerView 180

13.6 
时间选择器UIDataPicker 183

13.7 
搜索栏控件UISearchBar 186

13.7.1 
创建UISearchBar控件 186

13.7.2 
UISearchBar控件的更多功能按钮 188

13.7.3 
UISearchBar控件的附件视图 189

13.7.4 
UISearchBarDelegate协议详解 190

第14章  视图控制器与高级UI视图控件 192

14.1 
应用程序的界面管理器UIViewController 192

14.1.1 
关于MVC设计模式 192

14.1.2 
UIViewController的生命周期 193

14.1.3 
UIViewController之间的切换与传值 195

14.2 
导航视图控制器UINavigationController 200

14.2.1 
理解导航结构 201

14.2.2 
搭建使用导航结构的项目 201

14.2.3 
对导航栏进行自定义设置 203

14.2.4 
使用导航进行视图控制器的切换管理 205

14.3 
标签栏控制器UITabBarController 207

14.3.1 
创建以UITabBarController为项目结构工程 207

14.3.2 
对UITabBarController中的标签进行自定义配置 210

14.3.3 
标签栏上标签的溢出与排序功能 212

14.4 
警告视图控制器的应用 214

14.4.1 
认识UIAlertAction类 214

14.4.2 
使用UIAlertController创建警告框弹窗 215

14.4.3 
使用UIAlertController创建抽屉弹窗 217

14.5 
网页视图的应用 218

14.5.1 
网页视图UIWebView 218

14.5.2 
认识WebKit框架 221

14.5.3 
使用WKWebViewConfiguration对网页视图进行配置 222

14.5.4 
WKWebView中重要属性和方法解析 225

14.5.5 
关于WKUIDelegate协议 226

14.6 
滚动视图UIScrollView的应用 227

14.6.1 
创建UIScrollView滚动视图 227

14.6.2 
UIScrollViewDelegate协议介绍 228

14.6.3 
UIScrollView的缩放操作 230

14.7 
列表视图UITableView的应用 231

14.7.1 
创建UITableView列表 231

14.7.2 
进行数据载体UITableViewCell的自定义 235

14.7.3 
UITableView的编辑模式 238

14.7.4 
为UITableView添加索引栏 242

14.8 
集合视图UICollectionView的应用 243

14.8.1 
使用UICollectionView实现简单的九宫格布局 243

14.8.2 
使用FlowLayout进行更加灵活的九宫格布局 245

14.8.3 
实现炫酷的瀑布流布局 247

14.9 
分页控制器UIPageViewController的应用 251

14.9.1 
创建一个UIPageViewController工程 251

14.9.2 
关于UIPageViewControllerDelegate的更多应用 255

第15章
 动画与界面布局技术 259

15.1 
使用UIView层动画实现属性渐变效果 259

15.1.1 
UIView层的属性过渡动画 259

15.1.2 
UIView层的转场动画 263

15.2 
通过GIF文件播放动画 265

15.2.1 
使用原生的UIImageView来播放GIF动态图 265

15.2.2 
使用UIWebView来进行GIF动态图的播放 267

15.3 
iOS开发中的CoreAnimation核心动画技术 268

15.3.1 
初识CoreAnimation框架
268

15.3.2 
锚点对视图几何属性的影响 268

15.3.3 
几种常用的CALayer子类介绍 269

15.3.4 
CoreAnimation框架中的属性动画介绍 273

15.3.5 
CoreAnimation框架中的转场动画与组合动画 274

15.4 
炫酷的粒子效果 276

15.4.1 
粒子发射引擎与粒子单元 276

15.4.2 
创建火焰粒子效果 279

15.5 
Autolayout自动布局技术 281

15.5.1 
使用storyboard或者xib文件进行界面的自动布局 281

15.5.2 
进行视图间的约束布局 284

15.5.3 
使用原生代码进行Autolayout自动布局 285

15.5.4 
使用第三方框架SnapKit进行Autolayout自动布局 288

15.6 
使用Autolayout创建自适应高度的 UITextView输入框 289

第16章  网络与数据存储技术 292

16.1 
获取互联网上公开API所提供的数据 292

16.1.1 
注册APIStore会员 292

16.1.2 
进行API接口测试 293

16.1.3 
关于JSON数据格式 294

16.2 
在iOS开发中进行网络数据请求 295

16.2.1 
关于HTTP网络请求协议 295

16.2.2 
使用URLSesstion进行网络请求 296

16.3 
使用UserDefaults进行简单数据的持久化存储 298

16.3.1 
使用UserDefaults与Plist文件进行常见类型数据的存储 298

16.3.2 
使用Plist文件进行数据持久化处理 300

16.4 
iOS开发中的归档技术应用 302

16.4.1 
对简单数据类型的归档操作 302

16.4.2 
对自定义数据类型进行归档操作 304

16.5 
数据库在iOS开发中的应用 305

16.5.1 
操作数据库常用语句 305

16.5.2 
可视化数据库管理工具MesaSQLite的简单应用 308

16.5.3 
libsqlite3数据库操作库简介 310

16.5.4 
在iOS工程中调用libsqlite3库操作数据库 312

16.6 
使用CoreData框架进行数据管理 315

16.6.1 
使用CoreData框架进行数据模型设计 315

16.6.2 
使用CoreData进行数据的添加与查询操作 317

第3部分  项目实战

第17章  实战一:简易计算器 321

17.1 
计算器按键与操作面板的封装 321

17.2 
计算器显示板输入显示的逻辑开发 324

17.3 
计算器计算逻辑的设计 329

17.4 
为应用添加图标与启动页 332

第18章  实战二:点滴生活记事本
334

18.1 
项目工程的搭建 334

18.2 
主页记事分组视图的开发 337

18.3 
添加分组功能的开发 340

18.4 
数据库引入与记事分组信息的持久化 342

18.5 
记事列表界面的搭建 346

18.6 
新建记事功能的开发 349

18.7 
更新记事与删除记事功能的开发 355

第19章  实战三:《中国象棋》游戏
359

19.1 
项目工程的搭建与音频模块的开发 359

19.2 
《中国象棋》棋子控件的开发 363

19.3 
《中国象棋》棋盘控件的开发 366

19.4 
“兵”与“卒”行棋逻辑的开发 371

19.5 
“将”与“士”相关棋子行棋逻辑的开发 379

19.6 
“象”与“马”相关棋子行棋逻辑的开发 381

19.7 
“车”与“炮”棋子行棋逻辑的开发 387

19.8 
胜负判定逻辑开发与游戏功能完善 392

19.9 
拆分冗长的checkCanMove()方法 398

附录A  CocoaPods库管理工具的应用 406

附录B  关键概念检索表 409

前  言
前言

     当一本书出现在读者手中的时候,我想读者关心的莫过于两个问题:这本书的主要内容是什么与我能从这本书中收获到什么。本书是一本学习Swift编程语言的书,也是一本学习iOS 开发技能的书。我希望,任何读者,无论有编程基础或者无编程基础,只要对编程感兴趣,热爱软件开发这个行业,都可以通过本书达到自己的技能目标。Swift 3带来的新变化Swift语言是Apple公司于2014年在WWDC(苹果开发者大会)上发布的一门新的语言,相较与目前macOS/iOS 系统软件开发主流的Objective-C语言而言,Swift语言显得十分年轻。如果说一门编程语言年轻,那往往有着两层含义,一层说明此语言更加先进,其设计包含了现代编程语言所需要的特性。另一层是说此语言在很长一段时间内,可能都不会稳定,要经过多个版本的实践与迭代,才能稳定成型。Swift就是这样的一门语言,从2014年发布至今,已经经历了Swift 1.0版本、Swift 1.1版本、Swift 1.2版本、Swift 2.0版本、Swift 2.1版本、Swift 2.2版本、Swift 3.0版本与如今的Swift 3.0.1版本。下表列出了Swift语言的迭代记录:时间 版本2014-08-18 Swift 1.02014-10-16 Swift 1.12015-04-08 Swift 1.22015-09-16 Swift 2.02015-10-20 Swift 2.12016-03-21 Swift 2.22016-09-13 Swift 3.02016-10-27 Swift 3.0.1从上表可以看出,Swift语言的版本迭代速度十分之快,从语言的特性变化来看,Swift 3.0语言是一个分界点,之前版本在开发macOS/iOS应用时,采用的依然是Objective-C风格的API,在Swift 3.0版本中所有开发API做了颠覆性的更改,设计的更加切合Swift语言自身的特点。如果读者担心Swift语言的学习成本高,变化快,我个人认为,从Swift 3.0之后,读者可以放心地进行Swift语言的全面学习。首先Swift语言十分简洁,学习并不困难;其次,Swfit 3.0以及Swift 3.0.1的发布,代表Swift语言进入了一个相对稳定的时期。Swift 3.0语言比之前版本一个很显著的变化是简化了macOS/iOS开发API,使之更加切合Swift语言的特性,比如,之前字符串搜索函数如下:var range = string.rangeOfString(“Hello”)在Swift 3版本中,函数被修改成如下形式:var range = string.range(of: “Hello”)此类对开发API进行简化的更改几乎涵盖了所有API,对于有OS/iOS开发经验的读者来说,可能会觉得不习惯,使用习惯之后,你就会爱上这种更加简洁的编程风格。随着Swift语言的更新,其对运算符和流程控制语句也做了大刀阔斧的修改,关于 和–运算符,学习过C语言的读者一定还记得当时的痛苦,类似a 和 a这样的问题,总是给初学者带来很大的迷惑,在Swift 3语言中, 运算符和–运算符已经被移除,并且将for(;;)循环结构也进行了移除,只留下了更加高效的for-in循环结构,这些修改大大减小了学习语言的门槛并且降低了初学者出错的概率。本书的内容特点截止到本书截稿,Swift 3语言的版本为3.0.1。本书使用的Swift语言版本也是3.0.1版本。本书分为3大部分,部分将为读者介绍Swift语言的语法,这也是本书后面部分的基础。部分分为11章,每1章为读者介绍Swift语言的一些基础语法点,包括数据类型、流程控制语句、运算符、函数与闭包、枚举、结构体、类、属性与方法、对象构造与析构、内存管理、异常处理、扩展与协议等。这11章内容将竭力为读者全面介绍Swift语言的语法特点与应用场景,并且每一章后面都附带有习题供读者对本章所学知识进行测试与应用。本书的第二部分为iOS开发基础部分,目前Swift语言应用的主要场景在macOS/iOS应用的开发。这部分内容将系统地向读者介绍iOS 开发技能,包括独立UI控件的应用、视图界面逻辑的开发、动画与布局技术、网络与数据处理技术等。掌握了这些技能,理论上讲读者已经具备了独立开发一款iOS 应用程序的能力。本书的第三部分为实战部分,学习编程,实战是必经的一关。本书为读者安排了3个实战项目,项目的安排有简入难,并且各个项目的侧重点分布均匀,力图全面锻炼读者的实际开发能力。本书适合的读者本书是一本从基础到实战全面的Swift编程语言学习教程。如果你符合下面的特点,那么本书就是为你定制的:(1)对iOS 系统软件开发感兴趣,想要从事iOS 软件开发行业。(2)对编程感兴趣,对Swift编程语言感兴趣。(3)熟悉Objective-C语言,想要尝试Swift语言的开发者。如何学习本书编程是一门动手性很强的技能,因此在学习本书时,读者首先需要搭建好自己的开发环境(本书第1章有介绍)。在学习书中内容时要对照书中代码进行实际操作,并且本书的配套资源中也有书中所引用的全部代码,读者在学习时,也可以进行参考对照。如果读者没有良好的Swift语言基础,在学习本书时,请务必根据章节的顺序安排进行学习,只有有了良好的语言基础,再学习后面章节的时候才能得心应手。本书的配套资源笔者所录制的Objective-C版本的iOS 界面开发视频也随本书配套赠送,有兴趣的读者可以自行下载学习。下载地址:基础篇链接  https://pan.baidu.com/s/1cqTmRs 密码  idku进阶篇链接  https://pan.baidu.com/s/1dEKtgxr 密码  8qku读者也可以通过以下网址下载本书的源代码:http://pan.baidu.com/s/1c5ZNHW除上面提供的资源外,在51CTO学院上还有一套与本书内容完全匹配的教学视频,有需要的读者可以酌情购买:http://edu.51cto.com/course/course_id-6289.html。iOS技术交流群:203317592。如果你下载本书资源时遇到问题,请发邮件至:[email protected]获得帮助。邮件标题请注明:“获取Swift从入门到精通配书资源”。致谢从Swift 3.0语言发布前夕开始准备,到Swift 3.0.1发布后的后期纠正,将近10个月的努力,终于使本书如期送达读者的面前。这之间彻夜的校对资料、编写教案、分析案例的场景还历历在目,之中除了汗水与艰辛之外,更多的是在付出过程中获取的喜悦与成就感。如果你读者通过本书,达到了自己既定的学习目标;找到了自己心仪的工作;掌握了自己热爱的开发技能;这对我来说都将是一种莫大的鼓励,这也将是我作为编者的幸福。本书能够顺利完成,首先要感谢家人对我写作的支持,感谢朋友们的无私帮助,他们的鼓励与支持,为我提供了继续的动力。后,还有两个人对本书的完成十分重要,他们是清华大学出版社的王金柱编辑与UU跑腿iOS开发工程师吕远,王金柱编辑在我的写作过程中进行了悉心的指导,并提出了很多指导性的建议。吕远完成了本书19章内容的校队与补充。没有这两位的辛勤付出,本书也无法出现在读者的手上,我在此向他们表达衷心的感谢!

编者 珲少   2017年1月3日

媒体评论
评论
在线试读
第17章  实战一:简易计算器耳闻之不如目见之,目见之不如足践之。——刘向
本章将带领读者进入Swift编程语言学习的实战部分。所谓“实践出真知”,因此,要完全掌握一种编程技能,实战是必修课。本章将以一款简易的计算器为示例,将界面逻辑设计与界面开发结合,为读者讲解一个完整项目的开发思路与过程。在逐渐熟悉与理解项目的开发思路后,再加以练习,秩序渐近,你终会成为一名合格的软件开发者。通过本章,你将学习到:? 使用Aotulayout对横竖屏进行适配。? 封装计算方法类。? 独立视图控件的封装。? 视图控件间的交互与传值。? 开发款属于自己的完整iOS应用。17.1  计算器按键与操作面板的封装在开发一款完整的应用程序时,要始终遵循面向对象与封装的思路。对于计算器软件,可以将其拆分为界面与功能逻辑两部分。在界面开发中,又可以将界面分为显示板与操作板两部分,显示板顾名思义是用来显示用户输入和计算结果的,而操作面板排布着各种数字按钮和运算符号,主要用于接收用户的输入操作。本小节首先来做操作面板界面的开发。观察生活中常用的计算器操作面板,可以看到它由一系列的功能按钮组成,因此在编写操作面板之前,可以先来封装这些功能按钮。使用Xcode开发工具创建一个项目,并将其命名为Calculator,本项目采用Autolayout技术来进行界面布局,因此需要在项目中引入SnapKit第三方框架。在工程中新建一个类文件,使其继承自UIButton类,并命名为FuncButton。需要对其提供一个构造方法来设置按钮字体、颜色和风格,代码如下:class FuncButton: UIButton {        init() {        //要使用自动布局 这里的frame设置为(0,0,0,0)        super.init(frame: CGRect.zero)        //为按钮添加边框        self.layer.borderWidth = 0.5;        self.layer.borderColor = UIColor(red: 219/255.0, green: 219/255.0, blue: 219/255.0, alpha: 1).cgColor        //设置字体与字体颜色        self.setTitleColor(UIColor.orange, for: UIControlState.normal)        self.titleLabel?.font = UIFont.systemFont(ofSize: 25)        self.setTitleColor(UIColor.black, for: UIControlState.highlighted)    }    required init?(coder aDecoder: NSCoder) {        fatalError(“init(coder:) has not been implemented”)    }}在工程中创建一个继承自UIView的类,将其用作计算器的操作面板,并命名为Board。在其中引入SnapKit框架:import SnapKit首先在这个类中提供一个数组属性,用于存放操作面板上所有功能按钮的标题,数组如下:    var dataArray = [“0″,”.”,”%”,”=”                    ,”1″,”2″,”3″,” ”                    ,”4″,”5″,”6″,”-”                    ,”7″,”8″,”9″,”*”                    ,”AC”,”Delete”,”^”,”/”                    ]重写父类的构造方法,在其中进行界面的加载操作:    override init(frame: CGRect) {        super.init(frame: frame)        installUI()    }installUI()方法是开发者自定义的一个方法,用来对界面进行布局,实现如下:    func installUI(){   //创建一个变量 用于保存当前布局按钮的上一个按钮        var frontBtn:FuncButton!     //进行功能按钮的循环创建        for index in 0..<20{      //创建一个功能按钮            let btn = FuncButton()     //在进行自动布局前 必须将其添加到父视图上            self.addSubview(btn)             //使用SnapKit进行约束添加            btn.snp.makeConstraints({ (maker) in                //当按钮为每一行的个时 将其靠父视图左侧摆放                if index%4 == 0 {                    maker.left.equalTo(0)                }      //否则将按钮的左边靠其上个按钮的右侧进行摆放      else{                    maker.left.equalTo(frontBtn.snp.right)                }                //当按钮为行时,将其靠父视图底部摆放                if index/4 == 0 {                    maker.bottom.equalTo(0)                //当按钮不在行且为每行的个时,将其底部与上一个按钮的顶部对齐                }else if index%4 == 0 {                    maker.bottom.equalTo(frontBtn.snp.top)                //否则将其底部与上一个按钮底部对齐                }else{                    maker.bottom.equalTo(frontBtn.snp.bottom)                }                //约束宽度为父视图宽度的0.25倍                maker.width.equalTo(btn.superview!.snp.width). multipliedBy(0.25)                //约束高度为父视图高度的0.2倍                maker.height.equalTo(btn.superview!.snp.height). multipliedBy(0.2)            })     //设置一个标记tag值            btn.tag = index 100            //添加点击事件            btn.addTarget(self, action: #selector(btnClick(button:)), for: .touchUpInside)            //设置标题            btn.setTitle(dataArray[index], for: UIControlState.normal)            //对上一个按钮进行更新保存            frontBtn = btn        }    }上面代码中的布局方法采用了一个比较巧妙的设计思路,将按钮的排版定位为5行4列,布局的顺序为从下向上、从左向右依次布局。底部的一行和左侧的一列与父视图边界对齐,其余位置的功能按钮则参照其上一个按钮的位置进行约束布局。btnClick(button:)方法是用户点击按钮后的触发方法,读者可以实现它,在其中打印按钮的tag值以测试布局是否正确,后面会继续处理其交互功能。    func btnClick(button:FuncButton) {        print(button.title(for: .normal))    }运行工程,竖屏横屏下的界面效果如图17-1与图17-2所示。     图17-1  竖屏模式下的计算器面板界面 图17-2  横屏模式下的计算器面板界面init?(coder:)构造方法是UIView子类必须实现的一个必要构造方法,因此如果开发者对自定义的视图控件覆写了构造方法,那么必须实现这个构造方法,如果不使用此构造方法,开发者可以直接按如下方式编写:    required init?(coder aDecoder: NSCoder) {        fatalError(“init(coder:) has not been implemented”)    }17.2  计算器显示板输入显示的逻辑开发17.1节读者完成了计算器操作面板的界面开发,本小节继续完成计算器应用界面部分的相关开发。用户在操作面板上进行输入操作,输入的内容我们希望显示在计算器的显示屏上,同时,显示屏还兼有显示计算结果的功能。首先在Calculator工程中创建一个新的类文件,使其继承于UIView,并其命名为Screen,作为计算器的显示屏控件。显示屏应该分为两部分,一部分用于显示计算结果,另一部分用于显示用户输入的计算过程,这里可以使用两个UILabel控件来处理。Screen类除了用于显示相关计算信息外,还应该兼具一定的检查功能。举个例子,用户的输入可能是无规律的,某个用户很有可能在“ ”运算符后面再次输入“-”运算符,这样会出现不符合规则的算术表达式。因此,开发者需要对用户的输入进行一定控制。比如算术表达式的开头不能是运算符,运算符后面不能再次输入运算符等。实现Screnn类如下:class Screen: UIView {    //用于显示用户输入信息    var inputLabel:UILabel?    //用于显示历史记录信息    var historyLabel:UILabel?    //用户输入表达式或者计算结果字符串    var inputString = “”    //历史表达式字符串    var historyString = “”    //所有数字字符 用于进行检测匹配    let figureArray:Array = [“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7”, “8”,”9″,”.”]    //所有运算功能字符 用于进行检测匹配    let funcArray = [” “,”-“,”*”,”/”,”%”,”^”]    //默认的构造方法    init() {        inputLabel = UILabel()        historyLabel = UILabel()        super.init(frame: CGRect.zero)        installUI()            }    //进行界面的设计    func installUI() {        //设置文字的对齐方式为右对齐        inputLabel?.textAlignment = .right        historyLabel?.textAlignment = .right        //设置字体        inputLabel?.font = UIFont.systemFont(ofSize: 34)        historyLabel?.font = UIFont.systemFont(ofSize: 30)        //设置文字颜色        inputLabel?.textColor = UIColor.orange        historyLabel?.textColor = UIColor.black        //设置文字大小可以根据字数进行适配        inputLabel?.adjustsFontSizeToFitWidth = true        inputLabel?.minimumScaleFactor=0.5        historyLabel?.adjustsFontSizeToFitWidth = true        historyLabel?.minimumScaleFactor=0.5        //设置文字的截断方式        inputLabel?.lineBreakMode = .byTruncatingHead        historyLabel?.lineBreakMode = .byTruncatingHead        //设置文字的行数        inputLabel?.numberOfLines = 0        historyLabel?.numberOfLines = 0                self.addSubview(inputLabel!)        self.addSubview(historyLabel!)        //进行自动布局        inputLabel?.snp.makeConstraints({ (maker) in            maker.left.equalTo(10)            maker.right.equalTo(-10)            maker.bottom.equalTo(-10)            maker.height.equalTo(inputLabel!.superview!.snp.height). multipliedBy(0.5).offset(-10)        })        historyLabel?.snp.makeConstraints({ (maker) in            maker.left.equalTo(10)            maker.right.equalTo(-10)            maker.top.equalTo(10)            maker.height.equalTo(inputLabel!.superview!.snp.height). multipliedBy(0.5).offset(-10)        })    }    //提供一个输入信息的接口    func inputContent(content:String){        //如果不是数字也不是运算符 则不处理        if !figureArray.contains(content.characters.last!) && !funcArray. contains(content) {            return;        }        //如果不是首次输入字符        if inputString.characters.count>0 {            //数字后面可以任意输入            if figureArray.contains(inputString.characters.last!) {                inputString.append(content)                inputLabel?.text = inputString            }else{                //运算符后面只能输入数字                if figureArray.contains(content.characters.last!) {                    inputString.append(content)                    inputLabel?.text = inputString                }            }        }else{            //只有数字可以作为首个字符            if figureArray.contains(content.characters.last!){                inputString.append(content)                inputLabel?.text = inputString            }        }    }    //提供一个刷新历史记录的方法    func refreshHistory()  {        historyString = inputString        historyLabel?.text = historyString    }    //实现必要的构造方法    required init?(coder aDecoder: NSCoder) {        fatalError(“init(coder:) has not been implemented”)    }    }Board类可以接收用户的输入,Screen类需要获取用户的输入,它们之间的关联与交互是需要通过ViewController类来完成的。因此需要将Board类略作修改,将其获取到的数据向外传递,使用代理设计模式可以很方便地完成这个功能。在Board.swift文件中添加如下协议:protocol BoardButtonInputDelegate {    func boardButtonClick(content:String)}在Board类中添加一个代理属性如下:var delegate:BoardButtonInputDelegate?修改Board类中按钮的点击事件方法如下:    func btnClick(button:FuncButton) {        if delegate != nil {            //通过协议方法将值传递出去            delegate?.boardButtonClick(content: button.currentTitle!)                                                              //这样获取title更为方便        }    }ViewController类也需要将Board类实例和Screen类实例作为ViewController类的属性,方便ViewController类内部的各个函数之间相互调用:    let board = Board()    let screen = Screen()在installUI()方法中添加创建计算器操作板、显示屏对象的代码,如下:    func installUI() {        self.view.addSubview(board)        //设置代理        board.delegate = self        board.snp.makeConstraints { (maker) in            maker.left.equalTo(0)            maker.right.equalTo(0)            maker.bottom.equalTo(0)            maker.height.equalTo(board.superview!.snp.height).multipliedBy (2/3.0)        }                self.view.addSubview(screen)        screen.snp.makeConstraints { (maker) in            maker.left.equalTo(0)            maker.right.equalTo(0)            maker.top.equalTo(0)            maker.bottom.equalTo(board.snp.top)        }    }上面的代码也为Board实例设置了代理,因此需要使ViewController类遵守BoardButtonInputDelegate协议,如下所示:class ViewController: UIViewController,BoardButtonInputDelegate后,实现协议方法如下所示:func boardButtonClick(content: String) {    //如果是这些功能按钮,则进行功能逻辑处理    if content == “AC” || content == “Delete” || content == “=” {        //进行功能逻辑处理        screen.refreshHistory()    }else{        screen.inputContent(content: content)    }}运行工程,效果如图17-3与图17-4所示。     图17-3  竖屏模式下的计算器界面 图17-4  横屏模式下的计算器界面到此,简易计算器项目的界面部分已经基本开发完成,后面会与读者一起进行逻辑处理类的封装。将逻辑与界面分离和提供接口的编程方式是面向对象开发的关键,读者在练习时要深入体会。17.3  计算器计算逻辑的设计首先,读者需要将Screen类再做一些完善。例如当用户点击清空按钮时,输入的计算表达就应该被清空。当用户点击回退按钮时,上一次输入的字符就应该被清空。在Screen类中添加如下方法:    //清空显示屏中当前输入的信息    func clearContent()  {        inputString = “”    }    //删除显示屏中上次输入的字符    func deleteInput() {        if inputString.characters.count>0 {            inputString.remove(at: inputString.index(before: inputString.endIndex))            inputLabel?.text = inputString        }    }对于计算功能的实现,可以采取这样的思路:用户输入的本是一串表达式字符串,我们可以通过一个解析方法将字符串中的运算符和操作数分离开来,然后自左向右依次进行计算。需要注意,实际的数学运算会有运算优先级的控制,本项目作为简易计算器的演示,不再做复杂的优先级逻辑控制,计算方式一律采用从左向右依次计算的方式,有兴趣的读者可以自行实现优先级功能。在项目中新建一个类文件,使其继承于NSObject类,并命名为CalculatorEngine。将其作为计算引擎工具类,实现如下:class CalculatorEngine: NSObject {    //运算符集合    let funcArray:CharacterSet = [” “,”-“,”*”,”/”,”^”,”%”]    func calculatEquation(equation:String)->Double  {        //以运算符进行分割获取到所有数字        let elementArray = equation.components(separatedBy: funcArray)        //设置一个运算标记游标        var tip = 0        //运算结果        var result:Double = Double(elementArray[0])!        //遍历计算表达式        for char in equation.characters {            switch char {            //进行加法运算            case ” “:                tip = 1                if elementArray.count>tip {                    result =Double(elementArray[tip])!                }            //进行减法运算            case “-“:               tip = 1               if elementArray.count>tip {                result-=Double(elementArray[tip])!                }            //进行乘法运算            case “*”:               tip = 1               if elementArray.count>tip {                result*=Double(elementArray[tip])!                }            //进行除法运算            case “/”:                tip = 1                if elementArray.count>tip {                    result/=Double(elementArray[tip])!                }            //进行取余运算            case “%”:                tip = 1                if elementArray.count>tip {                    result = Double(Int(result)%Int(elementArray[tip])!)                }            //进行指数运算            case “^”:                tip = 1                if elementArray.count>tip {                    let tmp = result                    for _ in 1..

书摘插画
插图

插图

插图

插图

插图

插图

插图

插图

抢先评论了 “Swift从入门到精通” 取消回复

评论

还没有评论。

相关产品

加入购物车

数据结构和编程设计——应用C语言(第二版)(影印版)

EUR €56.99
加入购物车

Java从入门到精通(第4版)(附光盘)

EUR €43.99
评分 5.00 &sol; 5
加入购物车

笨办法学Python 3

EUR €38.99
阅读更多
缺货

C程序设计语言 第2版·

EUR €24.99

东东购的宗旨是服务喜爱阅读中文书籍的海外人民,提供一个完善的购书平台,让国人不论何时何地都能沉浸在书香之中,读着熟悉的中文字,回忆着家乡的味道。


安全加密结账 安心网络购物 支持Paypal付款

常见问题

  • 货物配送
  • 退换货政策
  • 隐私政策
  • 联盟营销

客户服务

  • 联系东东
  • 关于东东
  • 帮我找书
  • 货物追踪
  • 会员登入

订阅最新的优惠讯息和书籍资讯

选择币别

EUR
USD
CAD
AUD
NZD
NOK
GBP
CHF
SEK
CNY
UAH
ILS
SAR
MXN
KRW
MYR
SGD
HUF
TRY
JPY
HKD
TWD
facebookinstagram
©2020 东东购 EasternEast.com

限时特卖:用“SALE15”优惠券全场书籍85折!可与三本88折,六本78折的优惠叠加计算。 忽略