[WN] 更新Swift语法内容

This commit is contained in:
haobo_yang
2021-11-18 19:00:15 +08:00
parent bc382deb9b
commit 89cae59a1e
15 changed files with 113 additions and 122 deletions

View File

@@ -4,25 +4,34 @@
## 任务说明 ## 任务说明
iOS开发对硬件的要求较为严格我们建议身边有Mac/iMac相关设备同学进行学习。如果您有iPad或是对iOS开发的Swift面相协议语言感兴趣的话也欢迎您加入本次课程我们将提供基于Swift的基础语法教程与基于Swift的基础算法实现此外我们也将提供一种在虚拟机运行MacOS的方案。 iOS开发对硬件的要求较为严格我们建议身边有Mac/iMac相关设备同学进行学习。如果您有对iOS开发感兴趣的话也欢迎您加入本次课程我们将提供基于Swift的基础语法教程与基于Swift的基础算法实现此外我们也将提供一种在虚拟机运行MacOS的方案。
由于设备不同我们提出了两种学习路线1. MacOS端对算法内容不做硬性要求可根据实际需要进行学习但需要完成Swift语言搭建基础的app界面了解app开发的一般流程2. 其他端可仅进行Swift语法的学习并用Swift构建基础的算法内容。对于Task 02 部分的控件功能和实现仅需了解即可。 由于设备不同我们提出了两种学习路线1. MacOS端对算法内容不做硬性要求可根据实际需要进行学习但需要完成Swift语言搭建基础的app界面了解app开发的一般流程2. 其他端可仅进行Swift语法的学习并用Swift构建基础的算法内容。对于Task 02 部分的控件功能和实现仅需了解即可。3.我们添加了一些可选任务,同学们如果有条件的话,可以选择性的做一做,加深对移动端开发的了解。
## MacOS ## MacOS
**Task 00**Swift基础语法入门2天 **Task 00**Swift基础语法入门2天
- 了解Swift语言基础语法与面向协议特点 - 了解Swift语言基础语法与面向协议编程特点
- 学习闭包特性与基础控件 - 学习可选类型、闭包特性、类与结构体
**Task 01**基础插件与功能实现4天 **Task 01**基础插件与功能实现4天
- 学习Label、Button、Textfield等基础控件的使用 - 学习UIView、UILabel、UIButton、UIImageView、UITextfield等基础控件的使用
- 学习TableView、ScrollView与Cell等的设置和启动 - 学习UIScrollView、UITableView与Cell等的设置和启动
- 学习动画、音频、视频与基础权限等内容实现 - 学习动画、音频、视频与基础权限等内容实现
- 初识Cocopods利用优秀的第三方库简化开发流程 - 初识Cocopods利用优秀的第三方库简化开发流程
- 代码启动、注册页面跳转、设置app的logo与启动页面 - 代码启动、注册页面跳转、设置app的logo与启动页面
**Task 02**Datawhale项目练习5天可选
- 项目介绍
- 完成底部Tabbar功能开发
- 完成Me界面设置
- 完成注册/登录功能开发
- 提醒功能开发
**Task 02**项目练习5天 **Task 02**项目练习5天
- 酒店管理系统 - 酒店管理系统
@@ -36,7 +45,12 @@ iOS开发对硬件的要求较为严格我们建议身边有Mac/iMac相关设
- 通过Cocopods引入基本的第三方库对app进行优化 - 通过Cocopods引入基本的第三方库对app进行优化
- 通过代码对控件进行设置与页面搭建 - 通过代码对控件进行设置与页面搭建
**Task 03**大作业Datawhale首页开发4天可选
- 故事板模块开发
- 日历模块开发
- 记录模块开发
- 形成业务闭环
## iPad、Linux或Windows虚拟机 ## iPad、Linux或Windows虚拟机

View File

@@ -1,34 +1,29 @@
# Swift介绍与环境搭建 # Swift介绍与环境搭建
[TOC]
Swift 是一种支持多编程范式和编译式的开源编程语言苹果于2014年WWDC苹果开发者大会发布用于开发 iOSOS X 和 watchOS 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 在 Mac OS 和 iOS 平台可以和 Object-C 使用相同的运行环境。2015年6月8日苹果于WWDC 2015上宣布Swift将开放源代码包括编译器和标准库。
## 关于Swift ## 关于Swift
Swift 是一种非常好的编写软件的方式,无论是手机,台式机,服务器,还是其他运行代码的设备。它是一种安全,快速和互动的编程语言,将现代编程语言的精华和苹果工程师文化的智慧,以及来自开源社区的多样化贡献结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。 > **Swift** 是一种非常好的编写软件的编程语言,无论是手机,台式机,服务器,还是其他运行代码的设备。它是一种安全,快速和互动的编程语言,将现代编程语言的精华和苹果工程师文化的智慧,以及来自开源社区的多样化贡献结合了起来。
Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览playgrounds这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果 Swift 是一种支持多编程范式和编译式的开源编程语言苹果于2014年WWDC苹果开发者大会发布用于开发 iOSOS X 和 watchOS 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 在 Mac OS 和 iOS 平台可以和 Objective-C 使用相同的运行环境。2015年6月8日苹果于WWDC 2015上宣布Swift将开放源代码包括编译器和标准库
### Swift好在哪
Swift 通过采用现代编程模式来避免大量常见编程错误: - Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览playgrounds这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
- Swift 将强大的类型推理和模式匹配与现代轻巧的语法相结合,使复杂的想法能够以清晰简洁的方式表达。因此,代码不仅更容易编写,而且易于阅读和维护。
- 变量始终在使用前初始化 - Swift 代码被编译和优化,以充分利用现代硬件。语法和标准库是基于指导原则设计的,编写代码的明显方式也应该是最好的。安全性和速度的结合使得 Swift 成为从 “Helloworld” 到整个操作系统的绝佳选择
- 检查数组索引超出范围的错误 - 编译器LLVM对Swift性能进行了优化其性能平均比OC快30%左右;在开发阶段进行了优化,如字符串拼接、方法默认参数、面向协议编程、高阶函数等等很大程度上提高了开发效率
- 检查整数是否溢出。 - Swift 通过采用现代编程模式来避免大量常见编程错误:
- 可选值确保明确处理 `nil` - 变量始终在使用前初始化或解包,保证代码的安全性
- 内存被自动管理 - 检查数组索引超出范围的错误
- 错误处理允许从意外故障控制恢复 - 检查整数是否溢出
- 可选值确保明确处理 `nil` 值。
Swift 代码被编译和优化,以充分利用现代硬件。语法和标准库是基于指导原则设计的,编写代码的明显方式也应该是最好的。安全性和速度的结合使得 Swift 成为从 “Helloworld” 到整个操作系统的绝佳选择 - 内存被自动管理
- 错误处理允许从意外故障控制恢复。
Swift 将强大的类型推理和模式匹配与现代轻巧的语法相结合,使复杂的想法能够以清晰简洁的方式表达。因此,代码不仅更容易编写,而且易于阅读和维护。
## 环境搭建 ## 环境搭建
> Swift是一门开源的编程语言该语言用于开发OS X和iOS应用程序。
Swift是一门开源的编程语言该语言用于开发OS X和iOS应用程序 > 在正式开发应用程序前我们需要搭建Swift开发环境以便更好友好的使用各种开发工具和语言进行快速应用开发。由于Swift开发环境需要在OS X系统中运行因此其环境的搭建将不同于Windows环境下面就一起来学习一下Swift开发环境的搭建方法
在正式开发应用程序前我们需要搭建Swift开发环境以便更好友好的使用各种开发工具和语言进行快速应用开发。由于Swift开发环境需要在OS X系统中运行因此其环境的搭建将不同于Windows环境下面就一起来学习一下Swift开发环境的搭建方法。
成功搭建Swift开发环境的前提 成功搭建Swift开发环境的前提
- 一台Mac/iMac 。因为集成开发环境XCode只能运行在OS X系统上。 - 一台Mac/iMac 。因为集成开发环境XCode只能运行在OS X系统上。
- 电脑系统必须在OS 10.9.3及以上。 - 电脑系统必须在OS 10.9.3及以上。
- 电脑必须安装Xcode集成开发环境。 - 电脑必须安装Xcode集成开发环境。
@@ -37,21 +32,33 @@ Swift是一门开源的编程语言该语言用于开发OS X和iOS应用程
## 使用Xcode创建第一个程序 ## 使用Xcode创建第一个程序
在App Store下载Xcode完毕后双击运行 在App Store下载Xcode完毕后(这里以Xcode13为例),双击运行:
- 点击`Create a new Xcode project` - 点击`Create a new Xcode project`
![Alt text](./images/1637228746939.png)
<img src="./images/1.png" alt="avatar" style="zoom:40%;" />
- 选择`iOS`-`App``Next` - 选择`iOS`-`App``Next`
<img src="images/2.png" alt="2" style="zoom:33%;" /> ![Alt text](./images/1637228788344.png)
> 这里代表你选择开发一个iOS平台的App
> **简单介绍常见项目选择:**App创建一个标准的App模版也是我们创建新项目一般勾选的模版
> ducument App:文档App模版
> Game游戏App模版
> Augmented Reality App: AR项目模板
> Framework创建一个framework库类似于封装SDK等
> Static Library:创建静态库
> Metal library: metal库
> **顶部平台介绍**->Mutiplatfrom是跨平台开发如一套代码在Mac上运行、pad、iphone、ios也就是主要在iOS平台上运行的项目、macOS主要是在macOS上运行的项目开发、watchOS运行在apple watch上的项目、tvOS苹果电视项目
- 输入自己的`Product Name``Organization Identifier` - 输入自己的`Product Name``Organization Identifier`
<img src="images/3.png" alt="3" style="zoom:33%;" /> ![Alt text](./images/1637230229308.png)
这里我们默认选择Swift语言Interface选择Storyboard
> **product name**:表示项目名
> **Team** : 当前队伍如果是团队合作开发或企业开发会有专属的Team
> **Organization Identifier**:组织名
> **Interface** :选择是在故事板开发还是SwiftUI开发这里建议新手选择InterfaceSwiftUI需要Swift基础才能选择
> **Language** : 可以选择Swift与OC两种语言开发
- 初始页面如下,在左侧找到`ViewController.swift`,添加如下代码: - 初始页面如下,在左侧找到`ViewController.swift`,添加如下代码:
@@ -76,29 +83,14 @@ Swift是一门开源的编程语言该语言用于开发OS X和iOS应用程
} }
} }
``` ```
![Alt text](./images/4.png)
![4](images/4.png) - 点击运行,结果如下:![Alt text](./images/5.png)
- 点击运行,结果如下:
<img src="images/5.png" alt="5" style="zoom:33%;" />
至此我们完成了第一个iOS程序的搭建 至此我们完成了第一个iOS程序的搭建
## Xcode初探 ## Xcode初探
对于初学者而言Xcode中的storyboard提供了简单易懂的UI界面我们可以在storyboard上搭建自己想要的界面。 对于初学者而言Xcode中的storyboard提供了简单易懂的UI界面我们可以在storyboard上搭建自己想要的界面。![Alt text](./images/6.png)
双击编辑输入Hello World点击运行即可看到预览结果![Alt text](./images/7.png)
![6](images/6.png)
双击编辑输入Hello World点击运行即可看到预览结果
![7](images/7.png)
除了StoryboardXcode还存在另一种启动方式代码启动。在实际工程文件与开发过程中Storyboard上堆砌大量空间会导致运行卡顿因此本部分仅作为演示使用。 除了StoryboardXcode还存在另一种启动方式代码启动。在实际工程文件与开发过程中Storyboard上堆砌大量空间会导致运行卡顿因此本部分仅作为演示使用。

View File

@@ -1,18 +1,18 @@
# Swift语法基础部分 # Swift语法基础部分
[TOC]
## 基础部分 ## 基础部分
Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。 > Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。
Swift 包含了 C 和 Objective-C 上所有基础数据类型,`Int` 表示整型值; `Double``Float` 表示浮点型值; `Bool` 是布尔型值;`String` 是文本型数据。 Swift 还提供了三个基本的集合类型,`Array``Set``Dictionary` ,详见`集合类型`部分。 **Swift** 包含了 C 和 Objective-C 上所有基础数据类型,`Int` 表示整型值; `Double``Float` 表示浮点型值; `Bool` 是布尔型值;`String` 是文本型数据。 Swift 还提供了三个基本的集合类型,`Array``Set``Dictionary` ,详见`集合类型`部分。
就像 C 语言一样Swift 使用变量来进行存储并通过变量名来关联值。在 Swift 中,广泛的使用着值不可变的变量,它们就是常量,而且比 C 语言的常量更强大。在 Swift 中,如果你要处理的值不需要改变,那使用常量可以让你的代码更加安全并且更清晰地表达你的意图。 就像 C 语言一样,**Swift** 使用变量来进行存储并通过变量名来关联值。在 Swift 中,广泛的使用着值不可变的变量,它们就是常量,而且比 C 语言的常量更强大。在 Swift 中,如果你要处理的值不需要改变,那使用常量可以让你的代码更加安全并且更清晰地表达你的意图。
除了我们熟悉的类型Swift 还增加了 Objective-C 中没有的高阶数据类型比如元组Tuple。元组可以让你创建或者传递一组数据比如作为函数的返回值时你可以用一个元组可以返回多个值。 除了我们熟悉的类型,**Swift**还增加了 Objective-C 中没有的高阶数据类型比如元组Tuple。元组可以让你创建或者传递一组数据比如作为函数的返回值时你可以用一个元组可以返回多个值。
Swift 还增加了可选Optional类型用于处理值缺失的情况。可选表示 “那儿有一个值,并且它等于 *x* ” 或者 “那儿没有值” 。可选有点像在 Objective-C 中使用 `nil` ,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的 `nil` 指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。 **Swift** 还增加了可选Optional类型用于处理值缺失的情况。可选表示 “那儿有一个值,并且它等于 *x* ” 或者 “那儿没有值” 。可选有点像在 Objective-C 中使用 `nil` ,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的 `nil` 指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
Swift 是一门*类型安全*的语言,这意味着 Swift 可以让你清楚地知道值的类型。如果你的代码需要一个 `String` ,类型安全会阻止你不小心传入一个 `Int` 。同样的,如果你的代码需要一个 `String`,类型安全会阻止你意外传入一个可选的 `String` 。类型安全可以帮助你在开发阶段尽早发现并修正错误。 **Swift** 是一门*类型安全*的语言,这意味着 **Swift** 可以让你清楚地知道值的类型。如果你的代码需要一个 `String` ,类型安全会阻止你不小心传入一个 `Int` 。同样的,如果你的代码需要一个 `String`,类型安全会阻止你意外传入一个可选的 `String` 。类型安全可以帮助你在开发阶段尽早发现并修正错误。
## 常量和变量 ## 常量和变量
@@ -39,8 +39,7 @@ var currentLoginAttempt = 0
var x = 0.0, y = 0.0, z = 0.0 var x = 0.0, y = 0.0, z = 0.0
``` ```
> 注意 > **注意**
>
> 如果你的代码中有不需要改变的值,请使用 `let` 关键字将它声明为常量。只将需要改变的值声明为变量。 > 如果你的代码中有不需要改变的值,请使用 `let` 关键字将它声明为常量。只将需要改变的值声明为变量。
### 类型注解 ### 类型注解
@@ -71,8 +70,7 @@ welcomeMessage = "Hello"
var red, green, blue: Double var red, green, blue: Double
``` ```
> 注意 > **注意**
>
> 一般来说你很少需要写类型注解。如果你在声明常量或者变量的时候赋了一个初始值Swift 可以推断出这个常量或者变量的类型,请参考`类型安全和类型推断`。在上面的例子中,没有给 `welcomeMessage` 赋初始值,所以变量 `welcomeMessage` 的类型是通过一个类型注解指定的,而不是通过初始值推断的。 > 一般来说你很少需要写类型注解。如果你在声明常量或者变量的时候赋了一个初始值Swift 可以推断出这个常量或者变量的类型,请参考`类型安全和类型推断`。在上面的例子中,没有给 `welcomeMessage` 赋初始值,所以变量 `welcomeMessage` 的类型是通过一个类型注解指定的,而不是通过初始值推断的。
### 常量和变量的命名 ### 常量和变量的命名
@@ -89,8 +87,7 @@ let 🐶🐮 = "dogcow"
一旦你将常量或者变量声明为确定的类型,你就不能使用相同的名字再次进行声明,或者改变其存储的值的类型。同时,你也不能将常量与变量进行互转。 一旦你将常量或者变量声明为确定的类型,你就不能使用相同的名字再次进行声明,或者改变其存储的值的类型。同时,你也不能将常量与变量进行互转。
> 注意 > **注意**
>
> 如果你需要使用与 Swift 保留关键字相同的名称作为常量或者变量名,你可以使用反引号(`)将关键字包围的方式将其作为名字使用。无论如何,你应当避免使用关键字作为常量或变量名,除非你别无选择。 > 如果你需要使用与 Swift 保留关键字相同的名称作为常量或者变量名,你可以使用反引号(`)将关键字包围的方式将其作为名字使用。无论如何,你应当避免使用关键字作为常量或变量名,除非你别无选择。
你可以更改现有的变量值为其他同类型的值,在下面的例子中,`friendlyWelcome` 的值从 `"Hello!"`改为了 `"Bonjour!"`: 你可以更改现有的变量值为其他同类型的值,在下面的例子中,`friendlyWelcome` 的值从 `"Hello!"`改为了 `"Bonjour!"`:
@@ -108,27 +105,22 @@ let languageName = "Swift"
languageName = "Swift++" languageName = "Swift++"
// - languageName // - languageName
``` ```
### 输出常量和变量 ### 输出常量和变量
你可以用 `print(_:separator:terminator:)` 函数来输出当前常量或变量的值: 你可以用 `print(_:separator:terminator:)` 函数来输出当前常量或变量的值:
```swift ```swift
print(friendlyWelcome) print(friendlyWelcome)
// Bonjour! // Bonjour!
``` ```
`print(_:separator:terminator:)` 是一个用来输出一个或多个值到适当输出区的全局函数。如果你用 Xcode`print(_:separator:terminator:)` 将会输出内容到“console”面板上。`separator``terminator` 参数具有默认值,因此你调用这个函数的时候可以忽略它们。默认情况下,该函数通过添加换行符来结束当前行。如果不想换行,可以传递一个空字符串给 `terminator` 参数--例如,`print(someValue, terminator:"")` 。关于参数默认值的更多信息,请参考 [默认参数值](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/06_Functions.html#default_parameter_values)。 `print(_:separator:terminator:)` 是一个用来输出一个或多个值到适当输出区的全局函数。如果你用 Xcode`print(_:separator:terminator:)` 将会输出内容到“console”面板上。`separator``terminator` 参数具有默认值,因此你调用这个函数的时候可以忽略它们。默认情况下,该函数通过添加换行符来结束当前行。如果不想换行,可以传递一个空字符串给 `terminator` 参数--例如,`print(someValue, terminator:"")` 。关于参数默认值的更多信息,请参考 [默认参数值](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/06_Functions.html#default_parameter_values)。
Swift 用*字符串插值string interpolation*的方式把常量名或者变量名当做占位符加入到长字符串中Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义: **Swift** 用*字符串插值string interpolation*的方式把常量名或者变量名当做占位符加入到长字符串中,**Swift** 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
```swift ```swift
print("The current value of friendlyWelcome is \(friendlyWelcome)") print("The current value of friendlyWelcome is \(friendlyWelcome)")
// The current value of friendlyWelcome is Bonjour! // The current value of friendlyWelcome is Bonjour!
``` ```
> 注意 > **注意**
>
> 字符串插值所有可用的选项,请参考 [字符串插值](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/03_Strings_and_Characters.html#string_interpolation)。 > 字符串插值所有可用的选项,请参考 [字符串插值](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/03_Strings_and_Characters.html#string_interpolation)。
## 注释 ## 注释

View File

@@ -1,26 +1,22 @@
# 基本运算符 # 基本运算符
*运算符*是检查、改变、合并值的特殊符号或短语。例如,加号(`+`)将两个数相加(如 `let i = 1 + 2`)。更复杂的运算例子包括逻辑与运算符 `&&`(如 `if enteredDoorCode && passedRetinaScan`)。 > *运算符*是检查、改变、合并值的特殊符号或短语。例如,加号(`+`)将两个数相加(如 `let i = 1 + 2`)。更复杂的运算例子包括逻辑与运算符 `&&`(如 `if enteredDoorCode && passedRetinaScan`)。
**Swift** 支持大部分标准 C 语言的运算符,且为了减少常见编码错误做了部分改进。如:赋值符(`=`)不再有返回值,这样就消除了手误将判等运算符(`==`)写成赋值符导致代码错误的缺陷。算术运算符(`+``-``*``/``%` 等)的结果会被检测并禁止值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见 [溢出运算符](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/26_Advanced_Operators.html#overflow_operators)。
Swift 支持大部分标准 C 语言的运算符,且为了减少常见编码错误做了部分改进。如:赋值符(`=`)不再有返回值,这样就消除了手误将判等运算符(`==`)写成赋值符导致代码错误的缺陷。算术运算符(`+``-``*``/``%` 等)的结果会被检测并禁止值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见 [溢出运算符](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/26_Advanced_Operators.html#overflow_operators) **Swift** 还提供了 C 语言没有的区间运算符,例如 `a..<b``a...b`,这方便我们表达一个区间内的数值
Swift 还提供了 C 语言没有的区间运算符,例如 `a..<b``a...b`,这方便我们表达一个区间内的数值。
本章节只描述了 Swift 中的基本运算符,[高级运算符](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/26_Advanced_Operators.html) 这章会包含 Swift 中的高级运算符,及如何自定义运算符,及如何进行自定义类型的运算符重载。 本章节只描述了 Swift 中的基本运算符,[高级运算符](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/26_Advanced_Operators.html) 这章会包含 Swift 中的高级运算符,及如何自定义运算符,及如何进行自定义类型的运算符重载。
## 术语 ## 术语
运算符分为一元、二元和三元运算符: 运算符分为一元、二元和三元运算符:
- **一元**运算符对单一操作对象操作(如 `-a`)。一元运算符分前置运算符和后置运算符,*前置运算符*需紧跟在操作对象之前(如 `!b`*后置运算符*需紧跟在操作对象之后(如 `c!`)。
- **二元**运算符操作两个操作对象(如 `2 + 3`),是*中置*的,因为它们出现在两个操作对象之间。
- **三元**运算符操作三个操作对象,和 C 语言一样Swift 只有一个三元运算符,就是三目运算符(`a ? b : c`)。
- *一元*运算符对单一操作对象操作(如 `-a`)。一元运算符分前置运算符和后置运算符,*前置运算符*需紧跟在操作对象之前(如 `!b`*后置运算符*需紧跟在操作对象之后(如 `c!` 受运算符影响的值叫**操作数**,在表达式 `1 + 2` 中,加号 `+` 是二元运算符,它的两个操作数是值 `1` `2`
- *二元*运算符操作两个操作对象(如 `2 + 3`),是*中置*的,因为它们出现在两个操作对象之间。
- *三元*运算符操作三个操作对象,和 C 语言一样Swift 只有一个三元运算符,就是三目运算符(`a ? b : c`)。
受运算符影响的值叫*操作数*,在表达式 `1 + 2` 中,加号 `+` 是二元运算符,它的两个操作数是值 `1``2`
## 赋值运算符 ## 赋值运算符
*赋值运算符*`a = b`),表示用 `b` 的值来初始化或更新 `a` 的值: **赋值运算符**`a = b`),表示用 `b` 的值来初始化或更新 `a` 的值:
```swift ```swift
let b = 10 let b = 10
@@ -48,7 +44,7 @@ if x = y {
## 算术运算符 ## 算术运算符
Swift 中所有数值类型都支持了基本的四则*算术运算符* **Swift **中所有数值类型都支持了基本的四则**算术运算符**
- 加法(`+` - 加法(`+`
- 减法(`-` - 减法(`-`
@@ -72,10 +68,9 @@ Swift 中所有数值类型都支持了基本的四则*算术运算符*
### 求余运算符 ### 求余运算符
*求余运算符*`a % b`)是计算 `b` 的多少倍刚刚好可以容入 `a`,返回多出来的那部分(余数)。 **求余运算符**`a % b`)是计算 `b` 的多少倍刚刚好可以容入 `a`,返回多出来的那部分(余数)。
> 注意 > **注意**
>
> 求余运算符(`%`)在其他语言也叫*取模运算符*。但是严格说来,我们看该运算符对负数的操作结果,「求余」比「取模」更合适些。 > 求余运算符(`%`)在其他语言也叫*取模运算符*。但是严格说来,我们看该运算符对负数的操作结果,「求余」比「取模」更合适些。
我们来谈谈取余是怎么回事,计算 `9 % 4`,你先计算出 `4` 的多少倍会刚好可以容入 `9` 中: 我们来谈谈取余是怎么回事,计算 `9 % 4`,你先计算出 `4` 的多少倍会刚好可以容入 `9` 中:
@@ -84,7 +79,7 @@ Swift 中所有数值类型都支持了基本的四则*算术运算符*
你可以在 `9` 中放入两个 `4`,那余数是 1用橙色标出 你可以在 `9` 中放入两个 `4`,那余数是 1用橙色标出
在 Swift 中可以表达为: **Swift** 中可以表达为:
```swift ```swift
9 % 4 // 1 9 % 4 // 1
@@ -122,7 +117,7 @@ a = (b × 倍数) + 余数
### 一元负号运算符 ### 一元负号运算符
数值的正负号可以使用前缀 `-`(即*一元负号符*)来切换: 数值的正负号可以使用前缀 `-`(即**一元负号符**)来切换:
```swift ```swift
let three = 3 let three = 3
@@ -163,7 +158,7 @@ a += 2
## 比较运算符Comparison Operators ## 比较运算符Comparison Operators
所有标准 C 语言中的*比较运算符*都可以在 Swift 中使用: 所有标准 C 语言中的**比较运算符**都可以在**Swift**中使用:
- 等于(`a == b` - 等于(`a == b`
- 不等于(`a != b` - 不等于(`a != b`
@@ -218,13 +213,12 @@ if name == "world" {
("blue", false) < ("purple", true) // < ("blue", false) < ("purple", true) // <
``` ```
> 注意 > **注意**
> > **Swift** 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
> Swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
## 三元运算符Ternary Conditional Operator ## 三元运算符Ternary Conditional Operator
*三元运算符*的特殊在于它是有三个操作数的运算符,它的形式是 `问题 ? 答案 1 : 答案 2`。它简洁地表达根据 `问题`成立与否作出二选一的操作。如果 `问题` 成立,返回 `答案 1` 的结果;反之返回 `答案 2`的结果。 **三元运算符**的特殊在于它是有三个操作数的运算符,它的形式是 `问题 ? 答案 1 : 答案 2`。它简洁地表达根据 `问题`成立与否作出二选一的操作。如果 `问题` 成立,返回 `答案 1` 的结果;反之返回 `答案 2`的结果。
三元运算符是以下代码的缩写形式: 三元运算符是以下代码的缩写形式:
@@ -265,7 +259,7 @@ if hasHeader {
## 空合运算符Nil Coalescing Operator ## 空合运算符Nil Coalescing Operator
*空合运算符*`a ?? b`)将对可选类型 `a` 进行空判断,如果 `a` 包含一个值就进行解包,否则就返回一个默认值 `b`。表达式 `a` 必须是 Optional 类型。默认值 `b` 的类型必须要和 `a` 存储值的类型保持一致。 **空合运算符**`a ?? b`)将对可选类型 `a` 进行空判断,如果 `a` 包含一个值就进行解包,否则就返回一个默认值 `b`。表达式 `a` 必须是 Optional 类型。默认值 `b` 的类型必须要和 `a` 存储值的类型保持一致。
空合运算符是对以下代码的简短表达方法: 空合运算符是对以下代码的简短表达方法:
@@ -301,11 +295,11 @@ colorNameToUse = userDefinedColorName ?? defaultColorName
## 区间运算符Range Operators ## 区间运算符Range Operators
Swift 提供了几种方便表达一个区间的值的*区间运算符*。 **Swift** 提供了几种方便表达一个区间的值的**区间运算符**
### 闭区间运算符 ### 闭区间运算符
*闭区间运算符*`a...b`)定义一个包含从 `a``b`(包括 `a``b`)的所有值的区间。`a` 的值不能超过 `b` **闭区间运算符**`a...b`)定义一个包含从 `a``b`(包括 `a``b`)的所有值的区间。`a` 的值不能超过 `b`
闭区间运算符在迭代一个区间的所有值时是非常有用的,如在 `for-in` 循环中: 闭区间运算符在迭代一个区间的所有值时是非常有用的,如在 `for-in` 循环中:
@@ -324,7 +318,7 @@ for index in 1...5 {
### 半开区间运算符 ### 半开区间运算符
*半开区间运算符*`a..<b`)定义一个从 `a``b` 但不包括 `b` 的区间。 之所以称为*半开区间*,是因为该区间包含第一个值而不包括最后的值。 **半开区间运算符**`a..<b`)定义一个从 `a``b` 但不包括 `b` 的区间。 之所以称为**半开区间**,是因为该区间包含第一个值而不包括最后的值。
半开区间的实用性在于当你使用一个从 0 开始的列表如数组非常方便地从0数到列表的长度。 半开区间的实用性在于当你使用一个从 0 开始的列表如数组非常方便地从0数到列表的长度。
@@ -408,7 +402,7 @@ if !allowedEntry {
### 逻辑与运算符 #{logical_and_operator} ### 逻辑与运算符 #{logical_and_operator}
*逻辑与运算符*`a && b`)表达了只有 `a``b` 的值都为 `true` 时,整个表达式的值才会是 `true` **逻辑与运算符**`a && b`)表达了只有 `a``b` 的值都为 `true` 时,整个表达式的值才会是 `true`
只要任意一个值为 `false`,整个表达式的值就为 `false`。事实上,如果第一个值为 `false`,那么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做*短路计算short-circuit evaluation*。 只要任意一个值为 `false`,整个表达式的值就为 `false`。事实上,如果第一个值为 `false`,那么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做*短路计算short-circuit evaluation*。
@@ -463,9 +457,8 @@ if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
前两种情况,我们都不满足,所以前两个简单逻辑的结果是 `false`,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是 `true` 前两种情况,我们都不满足,所以前两个简单逻辑的结果是 `false`,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是 `true`
> 注意 > **注意**
> > **Swift** 逻辑操作符 `&&` 和 `||` 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
> Swift 逻辑操作符 `&&` 和 `||` 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
### 使用括号来明确优先级 ### 使用括号来明确优先级

View File

@@ -1,5 +1,5 @@
# 字符串和字符 # 字符串和字符
[TOC]
*字符串*是是一系列字符的集合,例如 `"hello, world"``"albatross"`。Swift 的字符串通过 `String`类型来表示。而 `String` 内容的访问方式有多种,例如以 `Character` 值的集合。 *字符串*是是一系列字符的集合,例如 `"hello, world"``"albatross"`。Swift 的字符串通过 `String`类型来表示。而 `String` 内容的访问方式有多种,例如以 `Character` 值的集合。
Swift 的 `String``Character` 类型提供了一种快速且兼容 Unicode 的方式来处理代码中的文本内容。创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。通过 `+` 符号就可以非常简单的实现两个字符串的拼接操作。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你可以在已有字符串中插入常量、变量、字面量和表达式从而形成更长的字符串,这一过程也被成为字符串插值。尤其是在为显示、存储和打印创建自定义字符串值时,字符串插值操作尤其有用。 Swift 的 `String``Character` 类型提供了一种快速且兼容 Unicode 的方式来处理代码中的文本内容。创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。通过 `+` 符号就可以非常简单的实现两个字符串的拼接操作。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你可以在已有字符串中插入常量、变量、字面量和表达式从而形成更长的字符串,这一过程也被成为字符串插值。尤其是在为显示、存储和打印创建自定义字符串值时,字符串插值操作尤其有用。

View File

@@ -1,5 +1,5 @@
# 集合类型 # 集合类型
[TOC]
Swift 语言提供 `Arrays``Sets``Dictionaries` 三种基本的*集合类型*用来存储集合数据。数组Arrays是有序数据的集。集合Sets是无序无重复数据的集。字典Dictionaries是无序的键值对的集。 Swift 语言提供 `Arrays``Sets``Dictionaries` 三种基本的*集合类型*用来存储集合数据。数组Arrays是有序数据的集。集合Sets是无序无重复数据的集。字典Dictionaries是无序的键值对的集。
![img](https://docs.swift.org/swift-book/_images/CollectionTypes_intro_2x.png) ![img](https://docs.swift.org/swift-book/_images/CollectionTypes_intro_2x.png)

View File

@@ -1,5 +1,5 @@
# 控制流 # 控制流
[TOC]
Swift 提供了多种流程控制结构,包括可以多次执行任务的 `while` 循环,基于特定条件选择执行不同代码分支的 `if``guard``switch` 语句,还有控制流程跳转到其他代码位置的 `break``continue` 语句。 Swift 提供了多种流程控制结构,包括可以多次执行任务的 `while` 循环,基于特定条件选择执行不同代码分支的 `if``guard``switch` 语句,还有控制流程跳转到其他代码位置的 `break``continue` 语句。
Swift 还提供了 `for-in` 循环用来更简单地遍历数组Array字典Dictionary区间Range字符串String和其他序列类型。 Swift 还提供了 `for-in` 循环用来更简单地遍历数组Array字典Dictionary区间Range字符串String和其他序列类型。

View File

@@ -1,5 +1,5 @@
# 函数 # 函数
[TOC]
*函数*是一段完成特定任务的独立代码片段。你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时候“调用”这个函数来完成它的任务。 *函数*是一段完成特定任务的独立代码片段。你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时候“调用”这个函数来完成它的任务。
Swift 统一的函数语法非常的灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值将被修改。 Swift 统一的函数语法非常的灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值将被修改。

View File

@@ -1,5 +1,5 @@
# 闭包 # 闭包
[TOC]
*闭包*是自包含的函数代码块可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块blocks以及其他一些编程语言中的匿名函数Lambdas比较相似。 *闭包*是自包含的函数代码块可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块blocks以及其他一些编程语言中的匿名函数Lambdas比较相似。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为*包裹*常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。 闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为*包裹*常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。

View File

@@ -1,5 +1,5 @@
# 枚举 # 枚举
[TOC]
*枚举*为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 *枚举*为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。
如果你熟悉 C 语言,你会知道在 C 语言中枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。 如果你熟悉 C 语言,你会知道在 C 语言中枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。

View File

@@ -1,5 +1,5 @@
# 结构体和类 # 结构体和类
[TOC]
*结构体*和*类*作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常量、变量和函数的语法,为你的结构体和类定义属性、添加方法。 *结构体*和*类*作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常量、变量和函数的语法,为你的结构体和类定义属性、添加方法。
与其他编程语言所不同的是Swift 并不要求你为自定义的结构体和类的接口与实现代码分别创建文件。你只需在单一的文件中定义一个结构体或者类,系统将会自动生成面向其它代码的外部接口。 与其他编程语言所不同的是Swift 并不要求你为自定义的结构体和类的接口与实现代码分别创建文件。你只需在单一的文件中定义一个结构体或者类,系统将会自动生成面向其它代码的外部接口。

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -1,5 +1,5 @@
# Windows 系统下安装 macOS # Windows 系统下安装 macOS
[TOC]
由于 iOS 开发必须使用 XCode而 XCode 又必须运行在 macOS 上,因此为了让使用 Windows 系统的朋友们也能进行 iOS 开发,我们将在 Windows 上通过虚拟机安装 macOS。 由于 iOS 开发必须使用 XCode而 XCode 又必须运行在 macOS 上,因此为了让使用 Windows 系统的朋友们也能进行 iOS 开发,我们将在 Windows 上通过虚拟机安装 macOS。
## 安装 VMware ## 安装 VMware