
作者:关东升著
页数:605
出版社:人民邮电出版社
出版日期:2016
ISBN:9787115415899
电子书格式:pdf/epub/txt
内容简介
畅销书《ios开发指南》作者最新力作
基于swift 2.x,教你如何从零开始开发并上架应用
涵盖cocoa touch框架、混合编程(objective-c、c/c 与swift)、并发编程、spritekit等
本书“同步练习”解析的配套视频课程详见 http://www.zhijieketang.com/course/151
第21章的配套视频详见 http://www.zhijieketang.com/course/152
作者简介
关东升
国内著名iOS和Cocos技术作家、iOS技术顾问、Cocos最有价值专家(CVP)、智捷课堂首席培训专家、51CTO社区iOS技术顾问。
他精通iOS、Android和Windows及HTML5等移动开发技术,擅长应用和游戏类项目开发,曾先后主持开发:大型网络游戏《神农诀》的iOS和Android客户端;国家农产品追溯系统的iPad客户端;酒店预订系统的iOS客户端;金融系统的iOS、Windows及Android客户端。与此同时,他长期为中国移动研究院、方正科技、大唐电信、中国石油、工商银行、南方航空、惠普、东软集团、NTT等企事业单位提供技术咨询及员工培训。
另著有:
《iOS开发指南》
《Swift开发指南》
《iOS传感器应用开发最佳实践》
《iOS网络编程与云端应用最佳实践》
《iOS图形图像、动画和多媒体编程技术最佳实践》
《品味移动设计》
《交互设计的艺术》
《iPhone与iPad开发实战》
《Android开发案例驱动教程》
《Android网络游戏开发实战》
《Cocos2d-x实战:C 卷》
《Cocos2d-x实战:JS卷》
《Cocos2d-x实战:Lua卷》
《Cocos2d-x实战:工具卷》
相关资料
本书适合广大ios开发者快速全面了解swift语言。作者针对已升级至2.x版本的swift语言,从基础语法讲起,介绍了基于swift语言的cocoa touch框架知识,以及swift与objective-c、c和c 语言的混合编程等内容。本书内容重点突出,且辅以大量示例代码和插图来帮助开发者加深理解。这不仅是初级开发者的入门教程,而且可以帮助有objective-c开发经验的人快速转型到swift ios应用开发上来。
——cocoachina社区
本书适用于广大swift初学者,作者作为国内知名的ios技术作家,通过大量案例讲解了swift语言开发的方方面面,既可以帮助ios初学者迅速掌握swift开发技能,又可以帮助程序员系统全面地梳理知识,提高开发水平。
——开源中国
本书是“51cto学院ios就业培训班”指定教材,有近万名学员在学习使用,深受51cto社区广大开发者和爱好者的好评和认可。《从零开始学swift》全面介绍了swift 2.x开发技巧,并配有大量习题,非常适合广大学员迅速掌握和巩固swift 2.x开发中的知识点。本书值得广大学员阅读参考。
——曹亚莉,51cto博客总编、51cto学院高级产品运营经理
本书是从零学习swift的参考指南,不仅讲解swift 2.x基础知识、ios和os x开发过程中常用的框架,而且专门通过两个示例全面而完整地呈现了移动应用开发与app store发布流程。书中给出的swift编程规范,更使得程序员在编写代码时有章可循。本书既可以作为swift学习教材,又可以作为swift开发人员学习提高的参考书和备查手册。
——智捷课堂
本书特色
本书基于swift 2.x,通过大量案例全面介绍苹果平台的应用开发。全书共分5 部分,包括swift 语法篇、cocoatouch 框架编程篇、混合编程篇、进阶篇、项目实战篇,囊括了开发工具介绍、语言基础知识、编写helloworld 程序,直至应用在app store 上线的所有内容。此外,本书前20 章专门配有同步练习,以帮助读者掌握所学知识。
目录
第一部分 swift语法篇第1章 准备起航 21.1 本书约定 21.1.1 示例代码约定 21.1.2 图示约定 31.1.3 函数和方法签名约定 41.1.4 承接上一行代码约定 51.1.5 代码行号约定 51.2 swift开发工具 61.2.1 xcode开发工具 61.2.2 appcode开发工具 121.3 本章小结 131.4 同步练习 13第2章 第一个swift程序 142.1 使用repl 142.1.1 启动swift repl 142.1.2 使用swift repl 152.2 使用playground 162.2.1 编程利器playground 162.2.2 编写helloworld程序 182.3 使用web 网站 212.4 通过xcode创建os x工程 222.4.1 创建os x工程 222.4.2 编译和运行 232.5 通过appcode创建os x工程 242.5.1 创建os x工程 242.5.2 编译和运行 252.6 使用swiftc命令 272.6.1 编译 272.6.2 运行 282.7 代码解释 282.8 在linux下编译和运行swift程序 292.9 本章小结 322.10 同步练习 32第3章 swift语法基础 333.1 标识符和关键字 333.1.1 标识符 333.1.2 关键字 343.2 常量和变量 353.2.1 常量 353.2.2 变量 363.2.3 使用var还是let 363.3 注释 373.4 表达式 383.5 本章小结 393.6 同步练习 39第4章 运算符 414.1 算术运算符 414.1.1 一元运算符 414.1.2 二元运算符 414.1.3 算术赋值运算符 434.2 关系运算符 434.3 逻辑运算符 454.4 位运算符 464.5 其他运算符 474.6 本章小结 484.7 同步练习 48第5章 swift原生数据类型 505.1 swift数据类型 505.2 整型 505.3 浮点型 515.4 数字表示方式 525.4.1 进制数字表示 525.4.2 指数表示 525.4.3 其他表示 535.5 数字类型之间的转换 535.5.1 整型之间的转换 535.5.2 整型与浮点型之间的转换 545.6 布尔型 545.7 元组类型 545.8 可选类型 565.8.1 可选类型概念 565.8.2 可选类型值拆包 565.8.3 可选绑定 575.9 本章小结 575.10 同步练习 57第6章 swift原生字符串 596.1 字符 596.1.1 unicode编码 596.1.2 转义符 606.2 创建字符串 616.3 可变字符串 616.3.1 字符串拼接 616.3.2 字符串插入、删除和替换 626.4 字符串比较 636.4.1 大小和相等比较 636.4.2 前缀和后缀比较 646.5 本章小结 656.6 同步练习 65第7章 控制语句 667.1 分支语句 667.1.1 if语句 667.1.2 switch语句 687.1.3 guard语句 697.2 循环语句 717.2.1 while语句 717.2.2 repeat-while语句 737.2.3 for语句 747.2.4 for-in语句 757.3 跳转语句 767.3.1 break语句 767.3.2 continue语句 787.3.3 fallthrough语句 797.4 范围与区间运算符 817.4.1 switch中使用区间运算符 817.4.2 for-in中使用区间运算符 827.5 值绑定 837.5.1 if中的值绑定 837.5.2 guard中的值绑定 847.5.3 switch中的值绑定 857.6 where语句 857.6.1 switch中使用where语句 867.6.2 for-in中使用where语句 867.6.3 guard中使用where语句 867.7 本章小结 877.8 同步练习 87第8章 swift原生集合类型 918.1 swift中的数组集合 918.1.1 数组声明和初始化 928.1.2 可变数组 938.1.3 数组遍历 948.2 swift中的字典集合 948.2.1 字典声明与初始化 958.2.2 可变字典 968.2.3 字典遍历 978.3 swift中的set集合 988.3.1 set声明和初始化 988.3.2 可变set集合 998.3.3 set集合遍历 1008.3.4 set集合运算 1018.4 本章小结 1028.5 同步练习 102第9章 函数 1049.1 使用函数 1049.2 传递参数 1059.2.1 使用外部参数名 1059.2.2 省略外部参数名 1059.2.3 参数默认值 1069.2.4 可变参数 1069.2.5 参数的传递引用 1079.3 函数返回值 1079.3.1 无返回值函数 1079.3.2 多返回值函数 1089.4 函数类型 1089.4.1 作为函数返回类型使用 1099.4.2 作为参数类型使用 1109.5 嵌套函数 1119.6 本章小结 1129.7 同步练习 112第10章 闭包 11510.1 回顾嵌套函数 11510.2 闭包的概念 11510.3 使用闭包表达式 11610.3.1 类型推断简化 11710.3.2 隐藏return关键字 11710.3.3 省略参数名 11810.3.4 使用闭包返回值 11810.4 使用尾随闭包 11910.5 捕获上下文中的变量和常量 12010.6 本章小结 12110.7 同步练习 121第11章 swift语言中的面向对象特性 12311.1 面向对象概念和基本特征 12311.2 swift中的面向对象类型 12311.3 枚举 12411.3.1 成员值 12411.3.2 原始值 12611.3.3 相关值 12711.4 结构体与类 12811.4.1 类和结构体定义 12811.4.2 再谈值类型和引用类型 12911.4.3 引用类型的比较 13111.4.4 运算符重载 13211.5 类型嵌套 13311.6 可选链 13411.6.1 可选链的概念 13411.6.2 使用问号(?)和感叹号(!) 13611.7 访问限定 13611.7.1 访问范围 13711.7.2 访问级别 13811.7.3 使用访问级别最佳实践 13811.8 选择类还是结构体最佳实践 14011.8.1 类和结构体的异同 14111.8.2 选择的原则 14111.9 本章小结 14211.10 同步练习 142第12章 属性与下标 14612.1 存储属性 14612.1.1 存储属性概念 14612.1.2 延迟存储属性 14712.2 计算属性 14812.2.1 计算属性的概念 14812.2.2 只读计算属性 15012.2.3 结构体和枚举中的计算属性 15012.3 属性观察者 15112.4 静态属性 15312.4.1 结构体静态属性 15412.4.2 枚举静态属性 15512.4.3 类静态属性 15612.5 使用下标 15612.5.1 下标概念 15712.5.2 示例:二维数组 15712.6 本章小结 15912.7 同步练习 159第13章 方法 16013.1 实例方法 16013.1.1 使用规范的命名 16013.1.2 结构体和枚举方法变异 16313.2 静态方法 16513.2.1 结构体静态方法 16513.2.2 枚举静态方法 16613.2.3 类静态方法 16613.3 本章小结 16713.4 同步练习 167第14章 构造与析构 16814.1 构造函数 16814.1.1 默认构造函数 16814.1.2 构造函数与存储属性初始化 16914.1.3 使用外部参数名 17014.2 构造函数重载 17214.2.1 构造函数重载概念 17214.2.2 构造函数代理 17214.2.3 类构造函数横向代理 17314.3 析构函数 17414.4 本章小结 17614.5 同步练习 176第15章 类继承 17815.1 从一个示例开始 17815.2 构造函数继承 17915.2.1 构造函数调用规则 17915.2.2 构造过程安全检查 18015.2.3 构造函数继承 18415.3 重写 18615.3.1 重写实例属性 18615.3.2 重写静态属性 18815.3.3 重写实例方法 18915.3.4 重写静态方法 19015.3.5 下标重写 19015.3.6 使用final关键字 19115.4 类型检查与转换 19315.4.1 使用is进行类型检查 19415.4.2 使用as、as!和as?进行类型转换 19515.4.3 使用any和anyobject类型 19715.5 本章小结 19815.6 同步练习 198第16章 扩展 20016.1 “轻量级”继承机制 20016.2 声明扩展 20016.3 扩展计算属性 20116.4 扩展方法 20216.5 扩展构造函数 20316.5.1 值类型扩展构造函数 20316.5.2 引用类型扩展构造函数 20416.6 扩展下标 20416.7 本章小结 20516.8 同步练习 205第17章 协议 20617.1 协议概念 20617.2 协议 20617.3 协议方法 20717.3.1 协议实例方法 20717.3.2 协议静态方法 20817.3.3 协议变异方法 20817.4 协议属性 21017.4.1 协议实例属性 21017.4.2 协议静态属性 21117.5 面向协议编程 21117.5.1 协议类型 21217.5.2 协议的继承 21417.5.3 协议扩展 21517.5.4 协议的合成 21617.5.5 扩展中遵从协议 21717.5.6 面向协议编程示例:表视图中使用扩展协议 21717.6 本章小结 22017.7 同步练习 220第18章 泛型 22218.1 一个问题的思考 22218.2 泛型函数 22218.2.1 使用泛型函数 22318.2.2 多类型参数 22318.3 泛型类型 22318.4 泛型扩展 22518.5 本章小结 22618.6 同步练习 226第19章 swift内存管理 22719.1 swift内存管理概述 22719.1.1 引用计数 22719.1.2 示例:swift自动引用计数 22819.2 强引用循环 22919.3 打破强引用循环 23319.3.1 弱引用 23319.3.2 无主引用 23619.4 闭包中的强引用循环 23819.4.1 一个闭包中的强引用循环示例 23819.4.2 解决闭包强引用循环 23919.5 本章小结 24119.6 同步练习 241第20章 错误处理 24320.1 cocoa错误处理模式 24320.2 do-try-catch错误处理模式 24420.2.1 捕获错误 24420.2.2 错误类型 24420.2.3 声明抛出错误 24520.2.4 在函数或方法中抛出错误 24520.2.5 try?和try!的使用区别 24620.3 示例:mynotes应用数据持久层实现 24720.3.1 mynotes应用介绍 24720.3.2 mynotes应用数据持久层设计 24820.3.3 实现note实体类 24820.3.4 notedao代码实现 24920.3.5 使用defer语句释放资源 25020.3.6 测试示例 25120.4 本章小结 25220.5 同步练习 252第21章 swift编码规范 25321.1 命名规范 25321.2 注释规范 25521.2.1 文件注释 25521.2.2 文档注释 25521.2.3 代码注释 25621.2.4 使用地标注释 25721.3 声明 25921.3.1 变量或常量声明 25921.3.2 属性声明 26021.4 代码排版 26021.4.1 空行 26021.4.2 空格 26121.4.3 断行 26221.4.4 缩进 26321.5 本章小结 265第二部分 cocoa touch框架编程篇第22章 foundation框架 26822.1 数字类nsnumber 26822.1.1 获得nsnumber对象 26822.1.2 比较nsnumber对象 27022.1.3 数字格式化 27122.1.4 nsnumber与swift原生数字类型之间的桥接 27222.2 字符串类 27322.2.1 nsstring类 27322.2.2 nsmutablestring类 27522.2.3 nsstring与string之间的桥接 27722.3 数组类 27822.3.1 nsarray类 27822.3.2 nsmutablearray类 27922.3.3 nsarray 与swift原生数组之间的桥接 28022.4 字典类 28122.4.1 nsdictionary类 28122.4.2 nsmutabledictionary类 28222.4.3 nsdictionary与swift原生字典之间的桥接 28322.5 nsset集合类 28322.5.1 nsset类 28422.5.2 nsmutableset类 28422.5.3 nsset与swift原生set之间的桥接 28522.6 文件管理 28622.6.1 访问目录 28622.6.2 目录操作 28722.6.3 文件操作 28822.7 字节缓存 28922.7.1 nsdata和nsmutabledata类 28922.7.2 示例:base64解码与编码 29122.8 日期与时间 29222.8.1 使用nsdate 类 29222.8.2 日期时间格式化 29422.8.3 使用nscalendar和nsdatecomponents类 29522.8.4 示例:时区转换 29622.9 使用谓词nspredicate过滤数据 29722.9.1 一个过滤员工花名册的示例 29822.9.2 使用谓词nspredicate 30022.9.3 nsprdicate与集合 30022.9.4 格式说明符 30122.9.5 运算符 30222.10 使用正则表达式 30422.10.1 在nspredicate中使用正则表达式 30522.10.2 使用nsregularexpression 30522.10.3 示例:日期格式转换 30722.11 本章小结 309第23章 ios开发基础 31023.1 ios 介绍 31023.2 第一个ios应用:helloworld 31023.2.1 创建工程 31123.2.2 xcode中的ios 工程模板 31623.2.3 程序剖析 31723.3 ios api 简介 31923.4 本章小结 319第24章 core foundation框架 32024.1 数据类型映射 32024.2 内存管理 32124.2.1 objective-c的mrc内存管理 32124.2.2 对象所有权 32224.2.3 内存托管对象 32324.2.4 内存非托管对象 32424.3 本章小结 324第25章 cocoa touch设计模式及应用 32525.1 单例模式 32525.1.1 问题提出 32525.1.2 解决方案 32525.2 目标与动作 32625.2.1 问题提出 32625.2.2 解决方案 32725.3 输出口 33125.3.1 问题提出 33125.3.2 解决方案 33125.4 选择器 33425.4.1 问题提出 33425.4.2 解决方案 33425.4.3 示例:使用定时器变换视图背景 33525.5 委托与数据源 33725.5.1 问题提出 33725.5.2 委托解决方案 33925.5.3 数据源解决方案 34325.6 通知机制 34625.6.1 问题提出 34625.6.2 解决方案 34625.6.3 示例:关闭和打开键盘 34725.7 mvc模式 34825.7.1 mvc模式概述 34825.7.2 cocoa touch中的mvc模式 34925.8 响应者链与触摸事件 35125.8.1 响应者对象与响应链 35125.8.2 触摸事件 35225.9 本章小结 357第26章 uikit框架 35826.1 视图控制器 35826.1.1 与导航相关的视图控制器 35826.1.2 视图控制器的生命周期 35826.2 视图与uiview 36026.2.1 uiview继承层次结构 36026.2.2 视图分类 36226.2.3 应用界面的构建层次 36226.3 界面构建技术 36326.3.1 使用故事板 36326.3.2 使用xib文件 36526.3.3 使用代码 36826.4 开关控件 37026.5 滑块控件 37126.6 分段控件 37326.7 工具栏 37426.8 导航栏 37626.9 表视图 37926.9.1 表视图组成 37926.9.2 单元格组成和样式 38026.9.3 示例:纯代码创建简单表视图 38126.10 本章小结 386第三部分 混合编程篇第27章 swift与objective-c混合编程 38827.1 选择语言 38827.2 文件扩展名 38827.3 swift与objective-c api映射 38827.3.1 构造函数映射 38927.3.2 方法名映射 39127.4 同一应用目标中的混合编程 39327.4.1 什么是目标 39427.4.2 swift调用objective-c 39627.4.3 objective-c调用swift 39927.5 同一框架目标中的混合编程 40227.5.1 链接库和框架 40227.5.2 swift调用objective-c 40427.5.3 测试框架目标 40727.5.4 objective-c调用swift 41027.6 本章小结 413第28章 swift与c/c 混合编程 41428.1 数据类型映射 41428.1.1 c语言基本数据类型 41428.1.2 c语言指针类型 41528.2 应用目标中的混合编程 41928.2.1 swift调用c api 41928.2.2 swift调用c api 42128.3 框架目标中的混合编程 42528.3.1 同一框架目标中swift调用c或c api 42528.3.2 swift调用第三方库中的c或c api 42828.4 示例:用sqlite嵌入式数据库实现mynotes数据持久层 43028.4.1 note实体类代码 43028.4.2 创建表 43128.4.3 插入数据 43228.4.4 查询数据 43428.4.5 应用沙箱目录 43528.4.6 表示层开发 43628.5 本章小结 440第四部分 进 阶篇第29章 程序调试 44229.1 xcode调试工具 44229.1.1 调试功能 44229.1.2 输出窗口 44329.1.3 变量查看窗口 44429.2 设置和查看断点 44529.2.1 断点设置 44529.2.2 管理断点 44629.3 使用xcode中的instruments工具 44729.3.1 跟踪内存使用 44729.3.2 内存泄漏查找 44929.4 ios 真机调试 45329.4.1 xcode设置 45329.4.2 设备设置 45529.5 本章小结 456第30章 并发编程 45730.1 并发相关概念 45730.1.1 cpu与并发执行 45730.1.2 进程与线程 45730.2 gcd技术 45730.2.1 gcd概念 45830.2.2 调度队列 45830.3 gcd示例 45830.3.1 主线程阻塞问题 45830.3.2 使用gcd 解决主线程阻塞 46030.4 gcd 与单例模式 46030.5 本章小结 461第31章 spritekit游戏引擎 46231.1 移动平台游戏引擎介绍 46231.2 第一个spritekit游戏 46231.2.1 创建工程 46231.2.2 工程剖析 46531.3 一切都是节点 46831.3.1 节点“家族” 46931.3.2 节点树 46931.3.3 节点中重要的方法 47031.3.4 节点中重要的属性 47031.4 精灵 47131.4.1 精灵类skspritenode 47131.4.2 示例:沙漠英雄场景 47331.4.3 使用纹理图集性能优化 47831.5 场景切换 48131.5.1 场景切换方法 48131.5.2 场景过渡动画 48131.5.3 示例:沙漠英雄场景切换 48131.6 动作 48431.6.1 常用动作 48431.6.2 组合动作 48731.6.3 示例:帧动画实现 49131.7 粒子系统 49331.7.1 粒子系统属性 49431.7.2 内置粒子系统模板 49531.8 游戏音乐与音效 49931.8.1 音频文件介绍 49931.8.2 ios和os x平台音频优化 49931.8.3 背景音乐 50031.8.4 3d音效 50131.9 物理引擎 50231.9.1 物理引擎核心概念 50231.9.2 物理引擎中的物体 50331.9.3 接触与碰撞 50431.10 本章小结 507第五部分 项目实战篇第32章 项目实战:基于分层架构的多版本iphone计算器应用 51032.1 应用分析与设计 51032.1.1 应用概述 51032.1.2 需求分析 51032.1.3 原型设计 51132.2 分层架构设计 51132.2.1 低耦合应用架构 51132.2.2 详细设计 51232.2.3 分层架构设计有多种模式 51432.2.4 选择语言 51432.3 基于同一工程同一目标纯swift的实现 51532.3.1 创建工程 51532.3.2 业务逻辑层开发 51632.3.3 表示层开发 52032.4 基于同一工程同一目标swift调用objective-c的实现 53132.4.1 在swift 工程中添加objective-c类 53132.4.2 objective-c实现业务逻辑层 53232.5 基于同一工程不同目标swift调用objective-c的实现 53432.5.1 添加业务逻辑层目标 53532.5.2 暴露的头文件calclogic.h 53532.5.3 修改表示层 53632.6 基于同一工作空间不同工程下swift调用objective-c的实现 53632.6.1 创建工作空间 53732.6.2 暴露头文件calclogic.h 53732.6.3 修改表示层 53732.7 本章小结 537第33章 游戏app实战:《迷失航线》 53833.1 《迷失航线》游戏分析与设计 53833.1.1 《迷失航线》故事背景 53833.1.2 需求分析 53833.1.3 原型设计 53933.1.4 游戏脚本 54033.2 任务1:游戏工程的创建与初始化 54033.2.1 迭代1.1:创建工程 54033.2.2 迭代1.2:自定义类型维护 54033.2.3 迭代1.3:添加资源文件 54333.3 任务2:创建loading场景 54333.3.1 迭代2.1:设计场景 54433.3.2 迭代2.2:loading动画 54533.3.3 迭代2.3:预处理加载纹理 54533.4 任务3:创建home场景 54633.4.1 迭代3.1:设计场景 54633.4.2 迭代3.2:实现代码 54733.5 任务4:创建设置场景 54933.5.1 迭代4.1:设计场景 55033.5.2 迭代4.2:实现代码 55033.6 任务5:创建帮助场景 55233.6.1 迭代5.1:设计场景 55333.6.2 迭代5.2:实现代码 55333.7 任务6:实现游戏场景 55433.7.1 迭代6.1:设计场景 55533.7.2 迭代6.2:创建敌人精灵 55633.7.3 迭代6.3:创建玩家飞机精灵 56033.7.4 迭代6.4:创建子弹精灵 56033.7.5 迭代6.5:初始化游戏场景 56133.7.6 迭代6.6:玩家移动飞机 56533.7.7 迭代6.7:游戏循环与任务调度 56633.7.8 迭代6.8:游戏场景菜单实现 56633.7.9 迭代6.9:玩家飞机发射子弹 56833.7.10 迭代6.10:子弹与敌人的碰撞检测 56933.7.11 迭代6.11:玩家飞机与敌人的碰撞检测 57133.8 任务7:游戏结束场景 57333.8.1 迭代7.1:设计场景 57333.8.2 迭代7.2:实现代码 57433.9 本章小结 575第34章 《迷失航线》游戏上架苹果app store 57634.1 苹果app store 57634.2 还有“最后一公里” 57734.2.1 添加图标 57734.2.2 添加启动界面 57934.2.3 修改发布产品属性 58134.3 为发布进行编译 58234.3.1 创建开发者证书 58334.3.2 创建app id 58734.3.3 创建描述文件 58934.3.4 发布编译 59334.4 发布上架 59434.4.1 创建应用 59534.4.2 应用定价 59734.4.3 基本信息输入 59734.4.4 上传应用 60134.4.5 提交审核 60334.5 审核不通过的常见原因 60434.5.1 功能问题 60434.5.2 用户界面问题 60434.5.3 商业问题 60534.5.4 不当内容 60534.5.5 其他问题 60534.6 本章小结 605
下载地址
立即下载(解压密码:www.teccses.org)
Article Title:《从零开始学Swift》
Article link:
https://www.teccses.org/616949.html