复制成功
  • 图案背景
  • 纯色背景
  •   |  注册
  • /
  • 批注本地保存成功,开通会员云端永久保存 去开通
  • rzchina1

    上传于:2015-02-11

    粉丝量:0

    该亚博足球app下载贡献者很忙,什么也没留下。

    

    Swift入门很简单试读

    下载积分:100

    内容提示: 目 录 第 1 篇 Swift 开发基础 第 1 章 编写第一个 Swift 程序 2 1. 1 初识 Swift 1. 1. 1 Swift 的诞生 2 1. 1. 2 Swift 的特点与不足 1. 2 搭建开发环境 3 1. 2. 1 安装 Xcode 6 3 1. 2. 2 安装组件 4 1. 2. 3 更新组件和亚博足球app下载 1. 3 编写第一个程序 5 1. 3. 1 创建项目 6 1. 3. 2 Xcode 6. 1 界面介绍 1. 3. 3 编译和运行 11 1. 3. 4 编写代码 11 1. 3. 5 生成可执行文件 1. 4 Swift 代码分析 14 1. 4. 1 代码的构成 14 1. 4. 2 标识符 14 1. 4. 3 关键字 15 1. 4. 4 注释 1. 4. 5 文件构成 17 1. 5 使用帮助亚博足球app下载 17 2 2 5...

    亚博足球app下载格式:PDF| 浏览次数:7| 上传日期:2015-02-11 11:23:00| 亚博足球app下载星级:
    目 录 第 1 篇 Swift 开发基础 第 1 章 编写第一个 Swift 程序 2 1. 1 初识 Swift 1. 1. 1 Swift 的诞生 2 1. 1. 2 Swift 的特点与不足 1. 2 搭建开发环境 3 1. 2. 1 安装 Xcode 6 3 1. 2. 2 安装组件 4 1. 2. 3 更新组件和亚博足球app下载 1. 3 编写第一个程序 5 1. 3. 1 创建项目 6 1. 3. 2 Xcode 6. 1 界面介绍 1. 3. 3 编译和运行 11 1. 3. 4 编写代码 11 1. 3. 5 生成可执行文件 1. 4 Swift 代码分析 14 1. 4. 1 代码的构成 14 1. 4. 2 标识符 14 1. 4. 3 关键字 15 1. 4. 4 注释 1. 4. 5 文件构成 17 1. 5 使用帮助亚博足球app下载 17 2 2 5 9 12 16 第 2 章 数据类型 19 2. 1 常量和变量 19 2. 1. 1 常量 2. 1. 2 变量 2. 1. 3 为声明的变量和常量指定数据类型 20 2. 2 简单的数据类型 21 2. 2. 1 整数(Integer) 21 2. 2. 2 整型 22 2. 2. 3 浮点类型 23 2. 2. 4 字符类型/字符串类型 25 2. 2. 5 布尔类型 26 19 20 2. 2. 6 可选类型 26 2. 3 字面值 2. 3. 1 整型字面值 27 2. 3. 2 浮点类型的字面值 28 2. 3. 3 字符型字面值 29 2. 3. 4 字符串字面值 29 2. 3. 5 布尔类型的字面值 30 2. 4 高级数据类型——元组 2. 5 类型别名 33 27 30 第 3 章 语句和表达式 34 3. 1 语句 34 3. 2 运算符与表达式 34 3. 2. 1 常用术语——元 3. 2. 2 赋值运算符和表达式 3. 2. 3 算术运算符和表达式 3. 2. 4 取余运算符和表达式 3. 2. 5 自增自减运算符和表达式 39 3. 2. 6 一元减运算符 41 3. 2. 7 一元加运算符 41 3. 2. 8 位运算符 41 3. 2. 9 溢出运算符 48 3. 2. 10 比较运算符和表达式 50 3. 2. 11 三元条件运算符 51 3. 2. 12 逻辑运算符和表达式 52 3. 2. 13 范围运算符 3. 2. 14 复合赋值运算符和表达式 56 3. 2. 15 求字节运算符和表达式 3. 2. 16 强制解析 57 3. 3 类型转换 58 3. 3. 1 整数的转换 58 3. 3. 2 整数和浮点数的转换 34 35 35 38 55 57 59 第 4 章 字符串 61 4. 1 字符串的初始化 61 4. 1. 1 字符串的种类 61 4. 1. 2 初始化空的字符串 62 4. 1. 3 使用字符串初始化字符串 62 4. 1. 4 计算字符个数 63 4. 1. 5 遍历字符 63 4. 2 字符串组合 63 4. 2. 1 字符串与字符组合 64 4. 2. 2 字符串与字符串组合 4. 3 字符串判断 66 4. 3. 1 判断字符串是否为空 4. 3. 2 判断字符串相等 4. 3. 3 判断前缀 67 4. 3. 4 判断后缀 68 4. 4 大小写转换 69 4. 4. 1 大写转换 69 4. 4. 2 小写转换 69 4. 5 Unicode 编码 70 4. 5. 1 Unicode 术语 70 4. 5. 2 Unicode 字符串 70 4. 5. 3 utf-8 编码 71 4. 5. 4 UTF-16 编码 4. 5. 5 UTF 标量 65 66 66 71 72 第 5 章 集合类型 73 5. 1 数组 73 5. 1. 1 数组字面量 73 5. 1. 2 数组的定义 73 5. 1. 3 数组的初始化 74 5. 2 数组的操作 76 5. 2. 1 获取数组中元素的个数 76 5. 2. 2 判断数组是否为空 76 5. 2. 3 判断两个数组是否共用相同的元素 77 5. 2. 4 复制数组 78 5. 2. 5 在末尾添加一个元素 5. 2. 6 插入值 79 5. 2. 7 读取值 80 5. 2. 8 修改值 80 5. 2. 9 删除值 82 5. 2. 10 遍历数组 84 5. 3 字典 85 5. 3. 1 字典字面量 85 5. 3. 2 字典的定义 85 5. 3. 3 字典的初始化 86 5. 4 字典的操作 87 5. 4. 1 获取字典中的元素个数 87 5. 4. 2 读取键的值 87 5. 4. 3 添加元素 88 5. 4. 4 修改键关联的值 5. 4. 5 删除键 89 78 88 5. 4. 6 遍历 5. 5 可变的集合类型 92 91 第 6 章 程序控制结构 93 6. 1 顺序结构 93 6. 1. 1 程序的执行流程 6. 1. 2 代码调试 94 6. 2 选择结构——if 语句 95 6. 2. 1 if 语句 95 6. 2. 2 if. . . else 语句 96 6. 2. 3 if. . . else if 语句 97 6. 3 选择结构——switch 语句 99 6. 3. 1 switch 语句基本形式 99 6. 3. 2 规则 1: 相同的常量或常量表达式 101 6. 3. 3 规则 2: 可执行的语句不能为空 102 6. 3. 4 规则 3: 多条件组合 6. 3. 5 规则 4: 范围匹配 102 6. 3. 6 规则 5: 使用元组 103 6. 3. 7 规则 6: 数值绑定 104 6. 3. 8 规则 7: 使用 where 关键字 105 6. 4 循环结构——for 语句 6. 4. 1 for. . . in 循环 107 6. 4. 2 for-condition-increment 条件循环 6. 5 循环结构——while 语句 109 6. 5. 1 while 循环 110 6. 5. 2 do while 循环 111 6. 6 跳转语句 112 6. 6. 1 continue 语句 112 6. 6. 2 break 语句 113 6. 6. 3 fallthrough 语句 114 6. 6. 4 使用标签语句 114 93 102 106 108 第 7 章 函数和闭包 117 7. 1 函数介绍 117 7. 2 使用无参函数 118 7. 2. 1 无参函数的声明定义 7. 2. 2 无参函数的调用 7. 2. 3 空函数 120 7. 3 使用有参函数 120 7. 3. 1 有参函数的声明定义 7. 3. 2 有参函数的调用 118 119 120 121 7. 3. 3 参数的注意事项 7. 4 函数参数的特殊情况 123 7. 4. 1 本地参数名 123 7. 4. 2 外部参数名 123 7. 4. 3 设定参数默认值 7. 4. 4 为外部参数设置默认值 126 7. 4. 5 可变参数 126 7. 4. 6 常量参数和变量参数 7. 4. 7 输入-输出参数 128 7. 5 函数的返回值 130 7. 5. 1 具有一个返回值的函数 130 7. 5. 2 具有多个返回值的函数 130 7. 5. 3 无返回值 132 7. 6 函数类型 132 7. 6. 1 使用函数类型 133 7. 6. 2 使用函数类型作为参数类型 134 7. 6. 3 使用函数类型作为返回值类型 134 7. 7 标准函数 135 7. 7. 1 绝对值函数 abs() 135 7. 7. 2 最大值函数 max() /最小值函数 min() 7. 7. 3 序列的最大值函数 maxElement() /最小值函数 minElement() 137 7. 7. 4 判断序列是否包含指定元素函数 contains() 7. 7. 5 序列排序函数 sort() 139 7. 7. 6 序列倒序函数 reverse() 139 7. 8 函数嵌套调用形式 140 7. 8. 1 嵌套调用基本形式 140 7. 8. 2 递归调用 141 7. 9 闭包 142 7. 9. 1 闭包表达式 143 7. 9. 2 使用闭包表达式的注意事项 146 7. 9. 3 Trailing 闭包 147 7. 9. 4 捕获值 148 122 125 127 136 138 第 2 篇 面向对象编程 第 8 章 类 152 8. 1 类与对象 152 8. 1. 1 类的组成 152 8. 1. 2 创建类 152 8. 1. 3 实例化对象 153 8. 2 属性 153 8. 2. 1 存储属性 154 8. 2. 2 计算属性 158 8. 2. 3 类型属性 162 8. 2. 4 属性监视器 165 8. 3 方法 168 8. 3. 1 实例方法 168 8. 3. 2 类型方法 171 8. 3. 3 存储属性、 局部变量和全局变量的区别 174 8. 3. 4 局部变量和存储属性同名的解决方法——self 属性 175 8. 4 下标脚本 176 8. 4. 1 定义下标脚本 176 8. 4. 2 调用下标脚本 177 8. 4. 3 使用下标脚本 177 8. 5 类的嵌套 181 8. 5. 1 直接嵌套 181 8. 5. 2 多次嵌套 182 8. 6 可选链接 184 8. 6. 1 可选链接的实现方式 184 8. 6. 2 通过可选链接调用属性、 下标脚本和方法 185 8. 6. 3 连接多个链接 188 第 9 章 继承 189 9. 1 为什么使用继承 189 9. 1. 1 减少代码量 189 9. 1. 2 扩展功能 190 9. 2 继承的实现 191 9. 2. 1 继承的定义 191 9. 2. 2 属性的继承 191 9. 2. 3 下标脚本的继承 9. 2. 4 方法的继承 193 9. 3 继承的特点 194 9. 3. 1 多层继承 194 9. 3. 2 不可删除 196 9. 4 重写 196 9. 4. 1 重写属性 196 9. 4. 2 重写下标脚本 199 9. 4. 3 重写方法 200 9. 4. 4 重写的注意事项 9. 4. 5 访问父类成员 202 9. 4. 6 阻止重写 205 9. 5 类型检查 208 9. 5. 1 类型检查——is 9. 5. 2 类型检查——as 193 201 208 210 9. 5. 3 AnyObject 和 Any 的类型检查 212 第 10 章 枚举类型 215 10. 1 枚举类型的组成 215 10. 2 定义枚举类型 10. 2. 1 任意类型的枚举类型 216 10. 2. 2 指定数据类型的枚举类型 216 10. 3 定义枚举类型的成员 217 10. 3. 1 定义任意类型的枚举成员 217 10. 3. 2 定义指定数据类型的枚举类型成员 218 10. 3. 3 注意事项 220 10. 4 实例化枚举类型的对象 221 10. 5 访问枚举类型中成员的原始值 10. 5. 1 通过成员访问原始值 221 10. 5. 2 通过原始值获取成员 223 10. 6 枚举成员与 switch 匹配 224 10. 7 相关值 226 10. 8 定义枚举类型的属性 227 10. 8. 1 计算属性 228 10. 8. 2 类型属性 228 10. 8. 3 属性监视器 229 10. 9 定义枚举类型的下标脚本 10. 10 定义枚举类型的方法 10. 10. 1 实例方法 230 10. 10. 2 类型方法 232 10. 11 枚举类型的应用 10. 11. 1 为常量/变量赋值 233 10. 11. 2 作为函数的参数 234 10. 12 枚举类型嵌套 235 10. 12. 1 直接嵌套 235 10. 12. 2 多次嵌套 236 215 221 229 230 233 第 11 章 结构 238 11. 1 结构的定义和实例化 238 11. 1. 1 结构的构成 11. 1. 2 定义结构 238 11. 1. 3 实例化对象 11. 2 定义结构的属性 239 11. 2. 1 存储属性 239 11. 2. 2 计算属性 241 11. 2. 3 类型属性 242 238 239 11. 2. 4 添加属性监视器 242 11. 2. 5 初始化实例对象 243 11. 3 定义结构的下标脚本 245 11. 4 定义结构的方法 246 11. 4. 1 实例方法 246 11. 4. 2 类型方法 247 11. 5 结构嵌套 11. 5. 1 直接嵌套 248 11. 5. 2 多次嵌套 249 11. 6 类、 枚举类型和结构的区别 251 11. 7 类、 枚举和结构的嵌套 251 11. 7. 1 枚举使用在类中 252 11. 7. 2 枚举使用在结构中 252 11. 7. 3 类使用在结构中 253 248 第 12 章 构造方法和析构方法 255 12. 1 值类型的构造器 255 12. 1. 1 默认构造器 12. 1. 2 自定义构造器 256 12. 1. 3 构造器代理 12. 2 类的构造器 264 12. 2. 1 默认构造器 12. 2. 2 自定义构造器 264 12. 2. 3 构造器代理 12. 2. 4 构造器的继承和重载 270 12. 3 构造器的特殊情况 277 12. 3. 1 可选类型 277 12. 3. 2 修改常量属性 278 12. 4 类的构造 12. 5 设置默认值 280 12. 5. 1 在定义时直接赋值 280 12. 5. 2 在构造器中赋值 281 12. 5. 3 使用闭包设置属性的默认值 12. 5. 4 使用函数设置默认值 283 12. 6 析构方法 12. 6. 1 理解析构 283 12. 6. 2 析构方法的定义 284 12. 6. 3 使用析构方法 284 12. 6. 4 构造方法和析构方法的区别 255 260 264 269 278 281 283 286 第 13 章 扩展和协议 287 13. 1 扩展 287 13. 1. 1 扩展的定义 13. 1. 2 扩展属性 287 13. 1. 3 扩展构造器 13. 1. 4 扩展方法 292 13. 1. 5 扩展下标脚本 294 13. 1. 6 扩展嵌套类型 295 13. 2 协议 296 13. 2. 1 协议的定义 13. 2. 2 协议的实现 13. 2. 3 协议的成员声明——属性 298 13. 2. 4 协议的成员声明——方法 301 13. 2. 5 协议的成员声明——可变方法 303 13. 3 可选协议 304 13. 3. 1 定义可选协议 305 13. 3. 2 声明可选成员 305 13. 3. 3 调用可选协议 307 13. 4 使用协议类型 13. 4. 1 协议类型作为常量、 变量等的数据类型 13. 4. 2 协议类型的返回值或参数 309 13. 4. 3 协议类型作为集合的元素类型 310 13. 5 在扩展中使用协议 311 13. 5. 1 在扩展中实现协议 311 13. 5. 2 定义协议成员 311 13. 5. 3 扩展协议声明 312 13. 6 协议的继承 312 13. 7 协议组合 314 13. 8 检查协议的一致性 315 13. 9 委托 316 287 290 296 296 309 309 第 3 篇 Swift 高级开发技术 第 14 章 自动引用计数(ARC) 320 14. 1 自动引用计数的工作机制 14. 2 循环强引用的产生 322 14. 2. 1 类实例之间的循环强引用 322 14. 2. 2 闭包引起的循环强引用 14. 3 循环强引用的解决方法 326 320 324 14. 3. 1 解决类实例之间的循环强引用 326 14. 3. 2 解决闭包引起的循环强引用 331 第 15 章 运算符重载 335 15. 1 为什么使用运算符重载 335 15. 2 算术运算符的重载 335 15. 3 一元减/加运算符的重载 337 15. 3. 1 一元减运算符的重载 337 15. 3. 2 一元加运算符的重载 338 15. 4 复合赋值运算符的重载 338 15. 5 自增自减运算符的重载 340 15. 5. 1 自增运算符的重载 340 15. 5. 2 自减运算符的重载 342 15. 6 比较运算符的重载 344 15. 6. 1 “==” 相等运算符的重载 344 15. 6. 2 “!=” 不相等运算符的重载 15. 6. 3 其他比较运算符的重载 15. 7 自定义运算符的重载 347 15. 7. 1 前置自定义运算符的重载 347 15. 7. 2 中置自定义运算符的重载 348 15. 7. 3 后置自定义运算符的重载 349 15. 7. 4 自定义运算符的优先级和结合性 351 15. 8 注意事项 357 15. 8. 1 重载后运算符的优先级 15. 8. 2 不可以重载的运算符 358 345 346 357 第 16 章 泛型 359 16. 1 为什么使用泛型 359 16. 2 泛型函数 16. 3 泛型类型 16. 3. 1 泛型枚举 361 16. 3. 2 泛型结构 361 16. 3. 3 泛型类 16. 4 泛型类的层次结构 364 16. 4. 1 使用泛型基类 364 16. 4. 2 使用泛型派生类 365 16. 5 具有多个类型参数的泛型 16. 6 类型约束 16. 7 关联类型 16. 7. 1 定义关联类型 368 16. 7. 2 扩展已存在类型为关联类型 360 361 363 366 367 368 370 16. 7. 3 约束关联类型 371 第 3 章 语句和表达式 程序是由一个或者多个语句构成的, 而程序的最小执行单位也是语句, 所以语句在编程中占据了 很重要的位置。 在 Swift 中, 最常见到的语句是由表达式构成的语句。 本章将详细讲解常见表达式和语句的使用。 3.1 语 句 在 Swift 语言中, 语句的构成是很简单的, 如下: 表达式 或者是: 表达式; 一般建议使用第一种形式。 在 Swift 语言中有两种语句: 一种是简单语句; 一种是控制流语句。 简单语句最为常见, 它由表达式或者声明组成。 控制流语句用于控制程序中语句的执行顺序。 Swift 有 3 种类型的控制流语句: 循环语句、 分支语句和控制转移语句。 这部分内容在后面章节具体讲解。 下面首先讲解简单语句的重要构成部分——表达式。 3.2 运算符与表达式 Swift 语言提供了 丰富的运算符。 它们是一些特殊的符号或短语, 用来查、 改或组合值。程序会针对一个或者多个运算符进行运算。 而由这些运算符构成的式子被称为表达式。 本节将为读者讲解 Swift 语言常用的运算符以及运算符所对应的表达式。 3.2.1 常用术语——元 元表示运算符所使用的目标数值个数(即操作数) 。 根据数值个数的不同, 运算符分为一元运算符、 二元运算符、 三元运算符。 它们的详细说明如表 3-1 所示。 表 3-1 常用运算符 运 算 符 说 明 一元运算符 它对一个目 标进行操作。 一元运算符分为一元前缀运算符和一元后缀运算符。 其中, 一元前缀运算符出现在目标的前面(例如-b) ; 一元后缀运算符出现在目 标的后面(例如 b--) 。 第 3 章 语句和表达式 · 35·续表 运 算 符 二元运算符 说 明 它对两个目标进行操作, 并且是中缀(即在两个操作数之间) 它对三个目标进行操作。 与 C 语言一样, Swift 也只有一个三元运算符, 即三元跳转运算符(a?b:c) 三元运算符 3.2.2 赋值运算符和表达式 赋值运算符一般使用“=” 表示, 由“=” 号连接起来的式子被称为赋值表达式。 它的功能就是计算右边表达式的值, 再赋予左边的变量。 其语法形式如下: 变量=表达式 其中, 表达式可以是一个变量、 常量, 也可以是一个表达式。 在第 2 章中, 所有的示例都使用到了赋值运算符。 注意: 如果右边分配的值具有多个值的元组, 其元组中的元素可以被分配给多个常量和变量。 代码如下: let (x,y) =(5,3) println(x, y) 运行结果如下: (5, 3) Program ended with exit code: 0 3.2.3 算术运算符和表达式 算术运算是基本的运算方式。 Swift 针对所有的数字类型支持 4 种标准算术运算符, 如表 3-2 所示。 表 3-2 标准算术运算符 运算符名称 加法运算符 减法运算符 乘法运算符 除法运算符 运算符 功 能 将两个数相加 将两个数相减 将两个数相乘 将两个数相除 + – * / 注意: 不同于 C 和 Objective-C, 默认情况下 Swift 的算术运算符不允许值溢出 。 并且算术运算符属于从左到右的结合性。 使用 标准算术运算符连接起来的式子被称为算术表达式, 其语法形式如下: 操作数 算术运算符 操作数 【示例 3-1】 下面就使用 4 种算术运算符实现两个操作数的加、 减、 乘、 除, 并将结果输出。 代码如下: import Foundation var a=10 var b=5 第 1 篇 Swift 开发基础 · 36· var c=a+b var d=a-b var e=a*b var f=a/b println(c) println(d) println(e) println(f) 运行结果如下所示: 15 5 50 2 Program ended with exit code: 0 算术运算的处理有以下 6 个规律, 需要遵循。 (1) 加法运算符对于字符串也一样适用。 产生的作用为连接字符串, 代码如下: import Foundation var str1="Hello" var str2="World" var a=str1+str2 println(a) 运行结果如下所示: HelloWorld Program ended with exit code: 0 (2) 在乘法中, 当两个操作数都为正数时, 所得的结果也为正数; 当两个操作数都为 //加法运算 //减少运算 //乘法运算 //除法运算 负数时, 所得的结果也为正数; 当两个操作数其中有一个为正数, 一个为负数时, 所得的结果就为负数。 代码如下: import Foundation var a=10 var b=(-5) var c=a*a var d=b*b var e=a*b println(c) println(d) println(e) 运行结果如下所示: 100 25 -50 Program ended with exit code: 0 (3) 在除法中, 当两个操作数都为正数时, 所得的结果也为正数; 当两个操作数都为负数时, 所得的结果也为正数; 当两个操作数其中有一个为正数, 一个为负数时, 所得的结果就为负数。 代码如下: import Foundation var a=10 第 3 章 语句和表达式 · 37·var b=(-5) var c=a/a var d=b/b var e=a/b println(c) println(d) println(e) 运行结果如下所示: 1 1 -2 Program ended with exit code: 0 (4) 在进行除法运算时, 当两个操作数都为整数时, 所得的结果也为整数, 即发生了整除运算; 当两个操作数有一个为浮点数时, 所得的结果也为浮点数。 代码如下: import Foundation var a1=9/4 println(a1) var a2=9. 00/(-4) println(a2) 运行结果如下: 2 -2. 25 Program ended with exit code: 0 注意: 9/4 的结果为 2, 这相当于算术运算的商。 (5) 在进行除法运算时, 除数不可以为 0, 否则就会出现错误, 如: import Foundation var x=0 var y=10/0 println(y) 由于除数为 0, 导致程序出现以下的错误信息: Division by zero (6) 可以将多个算术运算符组合起来使用, 代码如下: import Foundation let a=10+2*3/4%2 println(a) 运行结果如下: 11 Program ended with exit code: 0 注意: 当有多 个算术运算符时, 需要注意它的运算优先级别, 其中*、 /的优先级最高,其次是%, 最后是+、 –。 所以在计算上面代码中的算术表达式时, 首先需要计算2*3, 结果为 6; 其次计算 6/4, 结果为 1; 然后计算 1%2, 结果为 1; 最后计算10+1, 其结果为 11。 第 1 篇 Swift 开发基础 · 38· 3.2.4 取余运算符和表达式 取余运算符(%) 在其他语言中被称为模数运算符。 使用取余运算符连接起来的式子被称为取余表达式, 其语法形式如下: 操作数 % 操作数 【示例 3-2】 下面就使用取余运算符%计算 9%4 的余数, 并输出结果。 代码如下: import Foundation var a=9%4 println(a) 运行结果如下所示: 1 Program ended with exit code: 0 取余运算有以下 3 条规则需要注意。 (1) 余数的符号规则。 在进行取余操作时, 当两个操作数为正数时, 所得的结果也为正数; 当两个操作数都为负数时, 所得的结果也为负数; 当被除数为负数, 除数为正数时,所得的结果就为负数; 当被除数为正数, 除数为负数时, 所得的结果就为正数; 代码如下: import Foundation var a1=9%4 println(a1) var a2=(-9) %(-4) println(a2) var a3=(-9) %(4) println(a3) var a4=(9) %(-4) println(a4) 运行结果如下所示: 1 -1 -1 1 Program ended with exit code: 0 (2) 在进行取余操作时, 两个操作数除了 可以是整数外, 还可以是浮点数。 这一点是Swift 特有的特性。 代码如下: import Foundation var a=8%2. 5 println(a) 运行结果如下所示: 0. 5 Program ended with exit code: 0 (3) 在进行取余运算时, 除数不可以为 0, 否则就会出现错误, 如: import Foundation 第 3 章 语句和表达式 · 39·var x=0 var y=10%0 println(y) 由于除数为 0, 导致程序出现以下的错误信息: Division by zero 3.2.5 自增自减运算符和表达式 在很多语言中都提供了 自增自减运算符, Swift 语言也不例外。 它是作为增加或减少一个变量的值的快捷方式。 使用自增自减运算符连接起来的式子被称为自增自减表达式。 1. 自增运算符与表达式 自增运算符(++) 的作用是使变量的值自增 1。 自增运算符可以分为两种: 一种是前缀自增运算符; 一种是后缀自增运算符。 使用自增运算符连接起来的式子被称为自增表达式。 自增表达式也分为了两种: 一种是前缀自增表达式, 一种是后缀自增表达式。 (1) 前缀自增表达式的语法形式如下: ++运算分量 【示例 3-3】 下面使用前缀自增运算符实现自加 1, 并输出。 代码如下: import Foundation var a=0; println(a) println(++a) 运行结果如下: 0 1 Program ended with exit code: 0 注意: 在本示例中只输出 a 的结果, 就为 0, 如果要输出 ++a 的结果, 需要考虑它的功能, 即在返回其值以前自 动加 1, 所以结果就为 1。 (2) 后缀自增表达式的语法形式如下: 运算分量++ 读者可以将其看作是 a=a+1 简写为 a++的形式。 【示例 3-4】 下面就使用后缀自增运算符实现自加 1, 并输出。 代码如下: import Foundation var a=0 println(a) println(a++) println(a) 运行结果如下所示: 0 0 第 1 篇 Swift 开发基础 · 40· 1 Program ended with exit code: 0 在本示例中只输出 a 的结果, 就为 0, 如果要输出 a++的结果, 需要考虑它的功能,即在返回其值以后自动加 1, 所以首先返回现在 a 的值, 即执行 a++时输出 0, 然后再为 a自动加 1, 所以再一次输出 a 时, 结果就为 1。 前缀自增运算符与后缀自增运算符总结:  如果运算符写在变量之前, 它在返回其值之前对变量值加 1。  如果运算符写在变量之后, 它在返回其值之后对变量值加 1。 2. 自减运算符 自减运算符(--) 的作用是使变量的值自减 1。 自减运算符和自增运算符一样, 也分为了两种: 一种是前缀自减运算符; 一种是后缀自减运算符。 使用自减运算符连接起来的式子被称为自减表达式。 其中表达式也被分为了 两种: 一种是前缀自减表达式, 一种是后缀自减表达式。 (1) 前缀自减表达式的语法形式如下: --运算分量 【示例 3-5】 下面就是使用前缀自减运算符实现自减 1, 并输出。 代码如下: import Foundation var a=2; println(a) println(--a) 运行结果如下所示: 2 1 Program ended with exit code: 0 在本示例中只输出 a 的结果, 就为 2, 如果要输出--a 的结果, 需要考虑它的功能, 即在返回其值以前自动减 1, 所以结果就为 1。 (2) 后缀自减表达式的语法形式如下: 运算分量-- 读者可以将其看作是 a=a–1 简写为 a--的形式。 【示例 3-6】 下面就是使用后缀自减运算符实现自减 1 的功能, 并输出。 代码如下: import Foundation var a=2; println(a) println(a--) println(a) 运行结果如下所示: 2 2 1 Program ended with exit code: 0 第 3 章 语句和表达式 · 41·在本示例中只输出 a 的结果, 就为 2, 如果要输出 a--的结果, 需要考虑它的功能, 即在返回其值以后自动减 1。 所以, 首先返回现在 a 的值, 即执行 a--时输出 2, 然后再为 a自减 1, 所以再一次输出 a 时, 结果就为 1。 3.2.6 一元减运算符 在一个操作数之前加一个“–” 号, 此“–” 号就被叫作一元减运算符。 它的作用是将正数变为负数, 将负数变为正数。 由一元减运算符连接起来的式子被称为一元减表达式。其语法形式如下: -操作数; 【示例 3-7】 下面使用一元减运算符将数值 3 变为负数, 再将变为负数的 3 变为正数,并输出。 代码如下: import Foundation let three = 3 let minusThree = -three let plusThree = -minusThree println(minusThree) println(plusThree) 运行结果如下所示: -3 3 Program ended with exit code: 0 3.2.7 一元加运算符 在操作数以前加一个“+” 号, 此“+” 号就被叫作一元加运算符, 它基本上没有什么作用。 只是为了 对齐代码, 尤其是使用一元减运算符时。 由一元加运算符连接起来的式子被称为一元加表达式。 其语法形式如下: +操作数; 【示例 3-8】 下面是使用一元加运算符的示例。 代码如下: import Foundation let minusSix = -6 let alsoMinusSix = +minusSix println(alsoMinusSix) 运行结果如下所示: -6 Program ended with exit code: 0 3.2.8 位运算符 内存存储数据的基本单位为字节, 一个字节由 8 个位组成。 在二进制系统中, 每个 0 第 1 篇 Swift 开发基础 · 42· 或者 1 就是一个位, 也称为比特位。 位运算就是对二进制进行的运算。 在 Swift 中有专门对位运算使用的运算符——位运算符。 位运算符通常在诸如图像处理和创建设备驱动等底层开发中使用。 使用它可以单独操作数据结构中原始数据的比特位。 在使用一个自定义的协议进行通信的时候, 运用位运算符来对原始数据进行编码和解码是非常有效的。 位运算符的总结如表 3-3 所示。 表 3-3 位运算符 位运算符符号 位运算符名称 按位与 按位或 按位异或 取反 左移 右移 作 用 & 两个相应的二进制位都为 1, 则该位为 1, 否则为 0 两个相应的二进制位中只有一个为 1, 则该位为 1 两个相应的二进制位值相同则为 0, 否则为 1 将二进制数按位取反, 即 0 变 1, 1 变 0 将一个数的各二进制位全部左移 N 位, 右补 0 将一个数的各二进制位全部右移 N 位, 对于无符号位, 高位补 0| ^ ~ << >> 对位运算符中的&、 |、 ^、 ~的作用进行分析, 如图 3.1 所示。 图 3.1 位运算的说明 【示例 3-9】 以下就是使用&对 0b11111100 和 0b00111111 进行按位与运算并输出。 代码如下: import Foundation var a: UInt8=0b11111100 第 3 章 语句和表达式 · 43·var b: UInt8=0b00111111 var c=a&b println(c) 运行结果如下所示: 60 Program ended with exit code: 0 它的工作方式如图 3.2 所示。 图 3.2 按位与工作方式 【示例 3-10】 以下就是使用|对 0b10110010 和 0b01011110 进行按位或运算并输出。 代码如下: import Foundation var a: UInt8=0b10110010 var b: UInt8=0b01011110 var c=a| b println(c) 运行结果如下所示: 254 Program ended with exit code: 0 它的工作方式如图 3.3 所示。 图 3.3 按位或工作方式 第 1 篇 Swift 开发基础 · 44· 【示例 3-11】 以下就是使用^对 0b00010100 和 0b00000101 进行按位异或运算并输出。代码如下: import Foundation var a: UInt8=0b00010100 var b: UInt8=0b00000101 var c=a^b println(c) 运行结果如下所示: 17 Program ended with exit code: 0 它的工作方式如图 3.4 所示。 图 3.4 按位异或工作方式 【示例 3-12】 以下就是使用~对 0b10110010 进行按位取反运算并输出。 代码如下: import Foundation var a: UInt8=0b10110010 var b = ~a println(b) 运行结果如下所示: 77 Program ended with exit code: 0 它的工作方式如图 3.5 所示。 图 3.5 按位取反工作方式 1. 左移运算符 左移运算符(<<) 会将一个数字的各比特位按一定的位数向左移动。 其中, 左移分为 第 3 章 语句和表达式 · 45·了无符号整型左移和有符号整型左移两种。 下面就详细讲解这两种左移方式。 (1) 无符号整型左移 无符号整型左移是将一个数字的比特位向左移动指定的位置, 其中左边被移出整型存储边界的位数直接抛弃, 右边空白的位用 0 填补。 图 3.6 展示了 无符号整型 00001111 左移4 位的过程。 图 3.6 左移 其中, 第一行中的前 4 位被移出, 第二行中的后 4 位是补的空位。 【示例 3-13】 以下将通过<<将 15 向左移动 4 位, 代码如下: import Foundation let a=15 let b=a<<4 println("\(a) 向左移动 4 位后变为了 \(b) ") 对与此代码的分析过程可以参考图 3.6, 运行结果如下所示: 15 向左移动 4 位后变为了 240 Program ended with exit code: 0 //左移 注意: 左移的效果相当于将一个整数乘以一个因子为 2 的整数。 向左移动一个整数的比特位相当于将这个数乘以 2。 以下的运算就是将整数 15 的比特位向左移动 4 位。 2*2*2*2*15=240 (2) 有符号整型左移 有符号整型通过比特位的第一位来表示的, 如果第一位为 0 表示正数, 如果为 1 表示负数。 其余的比特位(称为数值位) 用来存储实值。 有符号正数和无符号正数在计算机里存储的结果是一样的, 如图 3.7 所示是+4 的二进制存储。 图 3.7 +4 的存储 第 1 篇 Swift 开发基础 · 46· 负数的存储(二进制存储) 就有一些复杂了 , 这里需要有一个运算, 即 2 的 n 次方减去负数的绝对值, 其中 n 为数值位的位数。 如–4, 它在 Int8 中有 7 位数值位, 所以它的二进制存储为: 27-4=124 然后再将 124 转为二进制数, 就是–4 的二进制存储, 如图 3.8 所示。 图 3.8 –4 的存储 除了 可以使用 2 的 n 次方减去负数的绝对值, 计算负数的二进制存储外, 还可以使用取反加 1 的方法(即补码) 实现负数的二进制的存放, 还是以–4 为例, 首先, 获取–4 的原码, 即 00000100, 然后进行取反: 00000100 取反 11111011 最后将取反的值加 1: 11111011+1 为 11111100 得到的 11111100 为–4 的二进制存储。 了 解了正数和负数的表示后, 再来看有符号整型的左移: 对于一个正数来说它的左移就是无符号整型的左移, 对于负数来说, 它也是一样的, 即左移 1 位时乘以 2。 【示例 3-14】 以下将–4 左移一位。 代码如下: import Foundation var a=(-4) var b=a<<1 println("向左移动 1 位后变为了\(b) ") 运行结果如下所示: 向左移动 1 位后变为了-8 Program ended with exit code: 0 2. 右移运算符 右移运算符(>>) 会将一个数字的各比特位按一定的位数向右移动。 其中, 右移分为了无符号整型右移和有符号整型右移。 以下就详细讲解这两种右移方式。 (1) 无符号整型右移 无符号整型右移是将一个数字的比特位向右移动指定的位置, 其中右边被移出整型存储边界的位数直接抛弃, 左边空白的位用 0 填补。 图 3.9 就展示了 无符号整型 00001111 右移 2 位的过程。 第 3 章 语句和表达式 · 47· 图 3.9 右移 其中, 第一行中的后 2 位被移出, 第二行中的前 2 位是补的空位。 【示例 3-15】 以下将通过>>将 15 向右移动 2 位, 代码如下: import Foundation let a=15 let b=a>>2 println("\(a) 向右移动 2 位后变为了 \(b) ") 运行结果如下: 15 向右移动 2 位后变为了 3 Program ended with exit code: 0 右移的效果相当于将一个整数除以一个因子为 2 的整数。 向右移动一个整数的比特位相当于将这个数除以 2。 如以下的运算就是将整数 15 的比特位向右移动 2 位。 15/2/2=3 (2) 有符号整型右移 //右移 对于有符号整型右移来说, 正数的右移和无符号整型的右移是一样的, 但是对于负数来说是有分别的, 它需要使用符号位去填充空白位。 如图 3.10 是将–4 向右移动 1 位的 操作。 图 3.10 负符整型的右移 【示例 3-16】 以下将–4 向右移动了 1 位。 代码如下: import Foundation var a=(-4) var b=a>>1 println("向右移动 1 位后变为了\(b) ") 运行结果如下: 第 1 篇 Swift 开发基础 · 48· 向右移动 1 位后变为了–2 Program ended with exit code: 0 3.2.9 溢出运算符 一般情况下, 为一个整型变量/常量赋值时都不会超出它的承载范围。 当超出时, Swift也不会让程序通过, 它会报错。 如以下的代码: import Foundation var a=Int8. max a=a+1 println(a) a 的值为 127, 这是 Int8 的最大范围, 再为 a 加 1 就超出了 Int8 所能承受的范围, 所以就会出现错误(这一点在数据类型中提到过) 。 如果开发者有意进行溢出操作, 可以使用溢出运算符进行。 在 Swift 中提供了 5 种针对整型的溢出运算符, 如表 3-4 所示。 表 3-4 溢出运算符 溢出运算符 说明 溢出加法 溢出减法 溢出乘法 溢出除法 溢出取余 &+ &– &* &/ &% 1. 值的上溢出 上溢出就是当一个值到达可以承载的最大值后, 如果再一次进行加或者乘运算, 就会导致新值的上溢出。 【示例 3-17】 使用溢出加来实现 UInt8 在获取最大值后, 实现加 1 的运算。 代码如下: import Foundation var a=UInt8. max a=a &+ 1 println(a) UInt8 所能承载的最大值为 255(二进制 11111111) , 然后为这个最大值使用&+加 1,此时 UInt8 就无法表达这个新值的二进制了, 就会导致溢出, 如图 3.11 所示。 图 3.11 值的上溢出 第 3 章 语句和表达式 · 49·在图 3.11 中可以看到, 新值的承载范围内的那部分为 00000000, 也就是 0。 运行结果如下所示: 0 Program ended with exit code: 0 2. 值的下溢出 下溢出因为数值太小而越界, 当一个值到达可以承载的最小值后, 如果再一次进行减运算, 就会导致新值的下溢出。 【示例 3-18】 使用溢出减来实现 UInt8 在获取最小值后, 实现减 1 的运算。 代码如下: import Foundation var a=UInt8. min a=a &- 1 println(a) UInt8 所能承载的最小值为 0(二进制 00000000) , 然后为这个最小值使用&–减 1,此时得到的二进制为 11111111(即 255) , 如图 3.12 所示。 图 3.12 值的下溢出 运行结果如下所示: 255 Program ended with exit code: 0 【示例 3-19】 使用溢出减来实现 Int8 在获取最小值后, 实现减 1 的运算。 代码如下: import Foundation var a=Int8. min a=a &- 1 println(a) 有符号整型也有下溢出, Int8 所能承载的最小值为–128(二进制 10000000) , 然后为这个最小值使用&–减 1, 此时得到的二进制为 01111111(即 127) , 如图 3.13 所示。 第 1 篇 Swift 开发基础 · 50· 图 3.13 有符号型的下溢出 运行结果如下所示: 127 Program ended with exit code: 0 3. 除0溢出 在进行除法运算时, 要求除数不可以为 0, 否则就会出现错误, 使用溢出除法(&/可以进行除 0 的操作) , 代码如下: import Foundation var x=0 var y=10 &/ 0 println(y) 运行结果如下: 0 Program ended with exit code: 0 3.2.10 比较运算符和表达式 比较运算符是用来对两个操作数进行大小比较的。 在 Swift 语言中, 提供了 6 种比较运算符, 这 6 种运算符的总结如表 3-5 所示。 表 3-5 比较运算符 运 算 符 运算符名称 功 能 实 例 结 果 < 小于 小于等于 大于 大于等于 等于 不等于 若 a<b, 结果为 true, 否则为 false 若 a<=b, 结果为 true, 否则为 false若 a>b, 结果为 true, 否则为 false 若 a>=b, 结果为 true, 否则为 false若 a==b, 结果为 true, 否则为 false若 a!=b, 结果为 true, 否则为 false2<3 true <= 7<=3 false > 7>3 true >= 3>=3 true == 7==3 false != 7!=3 true 第 3 章 语句和表达式 · 51·注意: 比较运算符也是有优先级别的, 其中最高的是>、 >=、 <、 <=, 其次是==、 !=。 比较运算符通常用在条件语句中(对于条件语句会在后面的章节中作讲解) 。 使用比较运算符连接起来的式子被称为比较表达式。 其语法形式如下: 表达式 比较运算符 表达式 注意: 表达式可以是一个运算符, 比较表达式返回的类型为 BOOl( 布尔类型) 。 【示例 3-20】 下面就使用比较运算符>、 <、 !=对 10 和 5 进行比较, 并输出。 代码如下: import Foundation let a=10 let b=5 let c=a>b println(c) let d=a<b println(d) let e=a ! = b println(e) 运行结果如下: true false true Program ended with exit code: 0 Swift 提供了 两个恒等运算符(===和!==) , 用它来测试两个对象引用是否来自于同一个对象实例。 (对于这两个运算符我们会在集合类型中作讲解。 ) 3.2.11 三元条件运算符 三元条件运算符(?:) 是一种特殊的运算符, 主要由 3 部分组成, 它一般用于对条件的求值。 使用三元条件运算符连接起来的式子被称为三元条件表达式。 其语法形式以及执行流程如图 3.14 所示。 图 3.14 语法形式以及执行流程 在图 3.14 中, 当表达式 1 的值为真时, 结果为表达式 2 的结果; 当表达式 1 的值为假时, 结果为表达式 3 的结果。 三元条件运算符其实是下面代码(关于 if else 语句会在后面的章节中做一个详细的讲解) 的简化: if 表达式 1 { 表达式 2 第 1 篇 Swift 开发基础 · 52· } else { 表达式 3 } 【示例 3-21】 下面使用三元条件运算符实现比较 5 和 3 哪个较大, 并输出较大的值。代码如下: import Foundation let max=5>3 ?5 : 3 println(max) 运行结果如下所示: 5 Program ended with exit code: 0 如果将以上代码使用 if else 语句编写, 代码如下: if 5>3{ println("5") }else{ println("3") } 运行结果如下所示: 5 Program ended with exit code: 0 从使用三元条件运算符编写的代码和使用 if else 语句编写的代码可以看出: 三元条件运算符要比 if else 语句编写的代码简单。 所以三元条件运算符提供了一个高效的写法。 但是请小心使用三元条件运算符, 如果过度使用会导致阅读代码更难。 要避免多个实例的三元条件运算符组合成一个复合语句。 3.2.12 逻辑运算符和表达式 在一些编程中, 一个语句往往需要满足多个条件才可以执行。 这时就需要将这多个语句进行组合。 逻辑运算符就可以把这多个语句进行组合, 从而实现更复杂的语句。 在 Swift语言中包括 3 种逻辑运算符, 如表 3-6 所示。 表 3-6 逻辑运算符 逻辑运算符 名 称 逻辑与 逻辑或 逻辑非 && || ! 使用逻辑运算符连接起来的式子被称为逻辑表达式。 其语法形式如下: 条件表达式 逻辑运算符 条件表达式 其中, 逻辑表达式返回的值也是 Bool(布尔值) 。 下面就针对这 3 种逻辑运算符逐一讲解。 第 3 章 语句和表达式 · 53·1. 逻辑与(&&) 逻辑与运算符使用&&表示。 使用逻辑与运算符关联起来的式子被称为逻辑与表达式,其语法形式如下: 条件表达式 1 && 条件表达式 2 其中, 只有当条件表达式 1 和条件表达式 2 的值都为 true 时, 逻辑与表达式的值才为true; 如果条件表达式 1 或者条件表达式 2 中有一个值为 false 时, 逻辑与表达式的值就为false。 【示例 3-22】 下面使用逻辑与运算符对两个表达式进行操作并输出结果。 代码如下: import Foundation let a = 7<10 && 8>5 println(a) let b = 7>10 && 8>5 println(b) 运行结果如下所示: true false Program ended with exit code: 0 对于以上的代码, a 输出了 true, 是由于逻辑与运算符关联的两个条件表达式的值都为真; b 输出 false, 是由于逻辑与运算符关联的两个条件表达式, 其中有一个(7>10) 为假。 2. 逻辑或(||) 逻辑或运算符使用||表示, 其使用逻辑或运算符关联起来的式子被称为逻辑或表达式,其语法形式如下: 条件表达式 1 | | 条件表达式 2 其中, 只要当条件表达式 1 或者条件表达式 2 其中一个值为 true 时, 逻辑或表达式的值就为 true。 只有当条件表达式 1 和 2 的值都为 false 时, 逻辑或表达式的值才为 false。 【示例 3-23】 下面使用逻辑或运算符对两个表达式进行操作并输出结果。 代码如下: import Foundation let a = 7<10 | | 8>5 println(a) let b = 7>10 | | 8>5 println(b) let c = 7>10 | | 8<5 println(c) 运行结果如下所示: true true false Program ended with exit code: 0 第 1 篇 Swift 开发基础 · 54· 对于以上的代码, a 输出了 true, 是由于逻辑或运算符关联的两个条件表达式都为真;b 输出 true, 是由于逻辑或运算符关联的两个条件表达式, 其中有一个(8>5) 为真; c 输出了 false, 是由于逻辑或运算符关联的两个条件表达式都为假。 3. 逻辑非(!) 逻辑非运算符使用!表示, 其使用逻辑非运算符关联起来的式子被称为逻辑非表达式,其语法形式如下: ! 条件表达式 其中, 当条件表达式的值为 true 时, 逻辑非表达式的值就为 false。 当条件表达式的值为 false 时, 逻辑非表达式的值就为 true。 【示例 3-24】 下面使用逻辑非运算符对两个表达式进行操作并输出结果。 代码如下: import Foundation let a = ! (7<10) println(a) let b = ! (7>10) println(b) 运行结果如下: false true Program ended with exit code: 0 这里总结一下逻辑运算符的运算规则, 如表 3-7 所示。 表 3-7 逻辑运算符运算规则表 a b !a !b a&&b a||b 真(true) 真(true) 假(false) 假 (false) 假 (false) 假(false) 真(true) 假(false) 假(false) 真(true) 真(true) 假(false) 真(true) 假(false) 真(true) 真(true) 假(false) 假(false) 假(false) 真(true)真(true)真(true)假(false)真(true) 有时为了满足某种需求, 需要将多个逻辑运算符组合, 来创建更长的复合表达式, 代码如下: import Foundation let a=7<10 let b=8<5 let c=8<9 let d = a&&b| | c println(d) 运行结果如下所示: true Program ended with exit code: 0 注意: 在本示例中使用 到了 多 个逻辑运算符, 此时需要考虑逻辑运算符的运算优先级别。其中优先级最高的是!, 其次是&&, 最后是||。 根据优先...

    关注我们

  • 新浪微博
  • 关注微信公众号

  • 打印亚博足球app下载
  • 复制文本
  • 下载Swift入门很简单试读.XDF
  • 您选择了以下内容