
本书创新性地将语言和框架结合起来介绍。全书分为两部分:第一部分是 Swift 语言介绍,共4章;第二部分则是iOS 8特性的介绍,从App开发者的角度阐述Swift语言在新SDK上的实际应用。本书在介绍iOS 8每个特性的过程中,配以丰富的Swift代码案例,以此让读者在学习iOS 8的同时,积累大量的 Swift 编码经验。
前言 Swift 是苹果公司最新的、类型安全的现代编程语言,可用于 Cocoa 和 Cocoa Touch 开发。Swift 在苹果公司的 2014 年 WWDC 大会中首次亮相,至今已有近一年的历史。迄今为止,App 商店中已经出现了相当数量的Swift 应用。 iOS 8 SDK随Swift同步推出,但得到的关注却远远小于后者。尤其是国内的开发者,对新SDK的研究和了解更是乏善可陈。实际上,iOS 8为开发者带来的机遇,远甚于苹果的新晋开发语言Swift。 苹果全新设计了iOS 8,为它添加了大量新特性,例如App扩展,Cloud Kit、Health Kit以及经过精心设计的游戏开发框架。可以说,从来没有任何一个iOS的版本,能够像iOS 8一样,给我们带来如此大的改变。每一个使用过iOS 8 SDK的开发者都能够感受到它前所未有的强大。 读者对象 本书主要适合以下读者阅读: 一是有 SDK 开发经验,想将现有App迁移到iOS 8的开发者,但苦于没有专门介绍 iOS 8 SDK 的书籍; 二是已经具备一定 Swift 语言基础,但缺少进一步结合 SDK 进行Swift开发示例或没有足够代码积累的读者; 三是有一定 SDK 开发经验,但还没有学习过 Swift 语言,想快速学习 Swift 并立即进行工程实践的读者; 四是既想快速学习 Swift 又需要详细了解 iOS 8 SDK的读者。 内容概览 全书共19章,分为两部分。 从第1章到第4章为本书第一部分,这部分介绍 Swift 语言。 第1章介绍学习 Swift 之前需要了解的背景知识和学习过程中需要注意的“注意事项”,主要包括 Swift 的源起、对Objective-C开发者带来的影响,以及初学者 FAQ。 第2章开始介绍 Swift 语言的基本语法,包括常量、变量、类型推断、字符串、流程控制。有了这些基础知识,我们起码可以在接下来的章节里写出一些“程序”。 第3章介绍 Swift 语言强大的类型系统,包括元组、可空类型、集合、枚举、结构和类,其中有不少类型是前任的Objective-C语言所没有的,这也是 Swift 最为独特的地方。 第4章介绍函数、闭包、协议、扩展、泛型。这些内容并不是孤立的,它们互相之间有着非常紧密的联系,充分反映了苹果在Objective-C发展过程中对 FP(函数式编程)方面的缺失做出的反思和改变。 从第5章开始,为本书第二部分,开始陆续介绍 iOS 8 SDK 中的新特性。 第5章介绍 iOS 8 在 UI 方面的两个主要内容:自动布局和自适应布局;尤其是后者“一次设计,所有设备运行”的特性。 第6章介绍Split View Controller 和旋屏。尤其是苹果对前者的改变,是广大 iOS 开发者期盼已久的事情。 第7章介绍 Presentation Controller。iOS 8 统一了以前版本中的视图呈现方式,例如 Alert、Popover 和 Search Controller,使开发者可以完全控制 View Controller 的呈现及动画过程。 第8章至第 13 章,依次介绍了 iOS 8 新增的 App 扩展,尤其对其中的几个组件进行了详细介绍:今日、分享、动作、照片编辑、文档提供者、键盘。 第14章通过一个示例项目对 CloudKit 框架进行介绍。 第15章介绍 Photos 框架,包括对照片的编辑处理。 第16章以案例的形式介绍 HandOff 框架。 第17章介绍WebKit,尤其是苹果的全新脚本引擎。 第18章介绍Live Rendering,并演示如何在自定义组件中使用Live Rendering技术。 第19章介绍Visual Effects。程序员从此可以使用官方API来生成一些有趣的视觉效果,例如模糊效果和雾玻璃效果。 特色分析 本书所面向的读者市场尚是一片空白。目前市面上(国内)还没有专门介绍 iOS 8 SDK 的图书。 本书顺应了市场潮流。本书借助苹果发布新版本 SDK 及新开发语言 Swift 之机,从一个应用开发者的角度,对二者进行了深入介绍,使开发者在熟悉新框架的过程中同时了解 Swift 这门语言。 内容深入,案例丰富。本书第二部分介绍了 iOS 8 SDK 框架的新特性,而且基本上每个新特性都配有一个单独的案例项目。 源代码 本书使用的源代码可在GitHub上下载: https://github.com/kmyhy/BookSourceCode
目录 第一部分 Swift语言编程指南 第1章 Swift初见 2 1.1 什么是Swift 2 1.2 为什么要学习Swift 3 1.3 Objective-C程序员学习Swift需要特别关注的地方 3 1.3.1 类型推断与类型安全 4 1.3.2 泛型 5 1.3.3 数组和字典 6 1.3.4 字符串 7 1.3.5 switch语句 8 1.4 关于Swift初学者的一些问题 9 1.4.1 从哪里获得Swift 9 1.4.2 是否需要先学Objective-C,再学Swift 9 1.4.3 “老鸟”们学习Swift是否会更轻松 10 1.4.4 开发iOS 8和OS X Yosemite程序只能用Swift吗 10 1.4.5 Swift是否能在当前的iOS和OS X版本上工作 10 1.4.6 什么是Playground 11 1.4.7 关于NDA 11 1.4.8 有Swift能做到而Objective-C无法做到的吗?反过来说呢 11 1.4.9 某些API是否无法被Swift调用 11 1.4.10 在Playground中,如何以图表方式查看变量值 12 1.4.11 如何打开REPL 13 1.4.12 Swift如何调用Objective-C代码或第三方库 14 1.4.13 Swift数组只能存储同一种类型的数据吗 15 1.4.14 字典是否也和数组一样是强类型的 15 1.4.15 Swift中有类似于Objective-C中的id吗 15 1.4.16 在 Swift中,如何自省 15 1.4.17 在Swift中如何使用GCD 16 1.4.18 Objective-C中提供的Internationalization宏是否仍然可用 16 1.4.19 仍然需要注意持有循环吗 17 1.4.20 何时使用strong、weak以及unowned 17 第2章 Swift语法基础 18 2.1 Playground 18 2.2 常量、变量、字符串 21 2.2.1 常量 21 2.2.2 变量 21 2.2.3 分号 22 2.2.4 字符串 22 2.2.5 字符串插值和运算 23 2.3 简单类型和类型推断 23 2.3.1 数值类型 23 2.3.2 类型转换 25 2.3.3 布尔类型 26 2.3.4 区间 26 2.3.5 元组 27 2.4 流程控制 28 2.4.1 for循环 28 2.4.2 while语句 31 2.4.3 if语句 31 2.4.4 switch语句 33 第3章 结构和类 38 3.1 可空类型 38 3.1.1 认识可空 38 3.1.2 声明可空 40 3.1.3 可空类型与非可空类型的转换 42 3.2 集合 44 3.2.1 数组 45 3.2.2 字典 47 3.3 枚举 50 3.3.1 定义枚举时填充原始值 50 3.3.2 使用其他类型 51 3.3.3 不填充原始值 52 3.3.4 联合 53 3.4 结构和类综述 54 3.4.1 属性 54 3.4.2 构造器 55 3.4.3 实例方法 56 3.4.4 类方法 56 3.4.5 下标方法 57 3.4.6 继承 59 第4章 Swift函数式编程 61 4.1 函数 61 4.1.1 函数的定义 61 4.1.2 外部参数名 62 4.1.3 简化外部参数名 62 4.1.4 默认值 63 4.1.5 可变参数 64 4.1.6 变量参数和输出参数 64 4.1.7 用函数作为参数 65 4.1.8 函数作为返回值 66 4.1.9 嵌套函数 67 4.2 闭包 68 4.2.1 声明闭包 69 4.2.2 匿名闭包 69 4.2.3 尾末闭包 70 4.2.4 值捕获 70 4.3 协议 71 4.3.1 协议的声明 71 4.3.2 实现协议 72 4.3.3 协议是一种类型 72 4.3.4 组合协议 73 4.4 扩展 74 4.4.1 声明扩展 74 4.4.2 扩展和协议 75 4.5 泛型 75 4.5.1 泛型函数 76 4.5.2 泛型和协议 76 4.5.3 泛型约束 77 4.5.4 泛型类型 78 4.6 可空链 79 4.6.1 ?操作符 79 4.6.2 ??操作符 82 第二部分 iOS 8 SDK 第5章 故事板与自适应布局 86 5.1 自适应布局入门 86 5.1.1 自适应布局的4个概念 87 5.1.2 Universal故事板 87 5.1.3 Size类 96 5.1.4 自适应字体 100 5.1.5 设备相关图片 101 5.2 自适应布局进阶 102 5.2.1 自适应单元格 102 5.2.2 自动安装视图 108 5.2.3 UITraitCollection类 119 5.2.4 覆盖Size类 121 5.2.5 Size相关图片 125 5.2.6 显示/隐藏导航栏 127 5.2.7 UIAppearance和Size类 128 第6章 UISplitViewController及旋屏 130 6.1 创建UISplitViewController应用 131 6.2 在iPhone App中使用UISplitViewController 140 6.2.1 创建Detail默认视图 140 6.2.2 在iPhone中展开UISplitViewController 143 6.2.3 记住用户选择 151 6.2.4 单元格指示器 154 6.2.5 对iPad进行适应 159 6.3 旋屏 162 6.3.1 旧的旋屏方法被废弃 162 6.3.2 自定义旋屏效果 165 6.3.3 单元格自适应大小 167 6.3.4 iPad旋屏 169 6.3.5 自适应的UILabel 176 第7章 视图控制器的呈现 180 7.1 初始项目 181 7.2 内置的Presentation Controller 182 7.2.1 UIAlertController 183 7.2.2 UIPopoverPresentationController 186 7.2.3 UISearchController 191 7.3 自定义UIPresentationController 196 7.3.1 Presented控制器和Presenting控制器 196 7.3.2 创建基本的PresentationController 197 7.3.3 自定义转换动画 200 7.3.4 高级定制 206 第8章 今日扩展 215 8.1 App扩展介绍 215 8.1.1 App扩展的类型 216 8.1.2 理解App扩展 219 8.2 今日扩展综述 223 8.2.1 介绍今日扩展 223 8.2.2 WeatherWidget示例 223 8.2.3 讨论 240 第9章 分享扩展 242 9.1 案例项目:SinaWeiboShare 242 9.1.1 实现容器App 243 9.1.2 创建分享扩展 257 9.2 讨论 267 9.2.1 配置SLComposeSheetConfigurationItem 268 9.2.2 分享其他文件 268 第10章 动作扩展 269 10.1 案例项目:SearchInICIBA 269 10.1.1 实现容器App 270 10.1.2 创建动作扩展 272 10.2 讨论 280 第11章 照片编辑扩展 281 11.1 案例项目:PhotoVintage 281 11.1.1 实现容器App 282 11.1.2 实现照片编辑扩展 282 11.2 讨论 292 第12章 文档提供者扩展 294 12.1 准备 295 12.1.1 工作机制 295 12.1.2 文档提供者扩展支持的4种操作 296 12.2 Bmob云服务 297 12.2.1 注册Bmob 297 12.2.2 创建应用 297 12.2.3 获取App Key 298 12.2.4 Bmob SDK 299 12.3 开始 299 12.3.1 添加扩展App 299 12.3.2 配置Info.plist和entitlements 300 12.4 加入Bmob SDK框架 301 12.4.1 添加CocoaPods框架 301 12.4.2 桥接头文件 304 12.4.3 上传图片到Bmob 305 12.4.4 实现Document Picker 308 12.4.5 实现宿主App 314 12.4.6 实现File Provider 319 12.5 讨论 322 第13章 键盘扩展 323 13.1 准备 323 13.2 键盘扩展的限制 323 13.3 值得信任 324 13.4 网络访问 325 13.5 开始 326 13.5.1 创建键盘扩展 326 13.5.2 显示键盘 327 13.5.3 设计按钮及布局 329 13.6 实现KeyboardViewController 331 13.6.1 创建连接 331 13.6.2 实现按键处理 332 13.6.3 大小写转换 334 13.6.4 切换符号集 335 13.6.5 按键动画 336 13.6.6 键盘最终运行效果 336 13.7 讨论 337 第14章 CloudKit 338 14.1 准备 339 14.1.1 用户授权 339 14.1.2 iCloud容器 340 14.1.3 数据库 340 14.1.4 Zone 340 14.1.5 记录 341 14.1.6 订阅 341 14.2 开始 342 14.2.1 打开iCloud 342 14.2.2 程序主界面 343 14.2.3 全局对象 344 14.2.4 获取用户ID及姓名 345 14.2.5 将数据封装为CKRecord 350 14.2.6 上传照片 353 14.2.7 查看已经上传的图片 359 14.3 高级API 361 14.3.1 不完全抓取 362 14.3.2 分页抓取 363 14.3.3 抓取并缓存图片 367 14.3.4 错误处理及网络重试 371 14.3.5 CloudKit Dashboard 372 14.4 讨论 373 第15章 Photos框架 375 15.1 Photos初步 375 15.1.1 模型对象 376 15.1.2 抓取概述 376 15.1.3 检索内容 377 15.1.4 初始项目 377 15.1.5 获取用户授权 378 15.1.6 抓取 379 15.1.7 显示图片 384 15.1.8 缓存 387 15.1.9 标记用户选择 390 15.2 Photos进阶 392 15.2.1 API介绍 393 15.2.2 初始项目 394 15.2.3 创建新的拼接图 396 15.2.4 显示拼接图 400 15.2.5 收藏和删除 403 15.2.6 增加修订记录 405 15.2.7 读取修订记录 406 15.2.8 注册变更通知 409 15.2.9 监听变更通知 409 15.2.10 让SpliceListVC处理变更通知 411 15.2.11 让PhotoPicker处理变更通知 413 15.3 讨论 414 第16章 Handoff 415 16.1 Handoff基础 416 16.2 开始 416 16.2.1 Handoff兼容性 417 16.2.2 测试Handoff 418 16.2.3 初始项目 419 16.2.4 设置Team ID 420 16.2.5 添加活动类型 421 16.3 view活动 422 16.3.1 创建活动并开始广播 422 16.3.2 更新用户活动 423 16.3.3 停止广播 423 16.4 edit活动 424 16.4.1 创建活动并开始广播 424 16.4.2 更新用户活动 425 16.4.3 停止广播 425 16.5 恢复用户活动 426 16.5.1 在应用程序委托中接收Handoff广播 426 16.5.2 恢复view活动 428 16.5.3 恢复edit活动 429 16.6 讨论 430 第17章 WebKit 432 17.1 开始 433 17.1.1 初始项目 433 17.1.2 创建WKWebView实例 433 17.1.3 加载Web页 434 17.1.4 监视页面加载进度 434 17.1.5 页面导航 436 17.1.6 WKNavigationDelegate协议 436 17.2 WebKit进阶 439 17.2.1 脚本调试工具 439 17.2.2 隐藏网页内容 440 17.2.3 抓取页面内容 444 17.2.4 显示PopoverController 448 17.3 讨论 450 第18章 Living Rendering 452 18.1 Living Rendering初步 453 18.1.1 开启Living Redering特性 453 18.1.2 暴露@IBInspectable属性 454 18.1.3 绘制boxLayer层 456 18.1.4 绘制markLayer层 457 18.1.5 绘制文本图层 459 18.2 Living Rendering进阶 461 18.2.1 使用位图 461 18.2.2 响应事件 462 18.3 讨论 463 第19章 Visual Effects 464 19.1 Visual Effects初步 464 19.1.1 初始项目 465 19.1.2 使用Visual Effect View实现模糊特效 465 19.1.3 使用Visual Effect View实现Vibrancy效果 467 19.2 Visual Effects进阶 469 19.2.1 使用UIBlurEffect实现模糊效果 469 19.2.2 使用UIVibrancyEffect实现Vibrancy效果 471 19.3 讨论 473