[WN] 更新Swift语法内容
This commit is contained in:
@@ -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
|
||||
|
||||
**Task 00**:Swift基础语法入门(2天)
|
||||
|
||||
- 了解Swift语言基础语法与面向协议特点
|
||||
- 学习闭包特性与基础控件
|
||||
- 了解Swift语言基础语法与面向协议编程特点
|
||||
- 学习可选类型、闭包特性、类与结构体
|
||||
|
||||
**Task 01**:基础插件与功能实现(4天)
|
||||
|
||||
- 学习Label、Button、Textfield等基础控件的使用
|
||||
- 学习TableView、ScrollView与Cell等的设置和启动
|
||||
- 学习UIView、UILabel、UIButton、UIImageView、UITextfield等基础控件的使用
|
||||
- 学习UIScrollView、UITableView与Cell等的设置和启动
|
||||
- 学习动画、音频、视频与基础权限等内容实现
|
||||
- 初识Cocopods,利用优秀的第三方库简化开发流程
|
||||
- 代码启动、注册页面跳转、设置app的logo与启动页面
|
||||
|
||||
**Task 02**:Datawhale项目练习(5天)(可选)
|
||||
|
||||
- 项目介绍
|
||||
|
||||
- 完成底部Tabbar功能开发
|
||||
- 完成Me界面设置
|
||||
- 完成注册/登录功能开发
|
||||
- 提醒功能开发
|
||||
|
||||
**Task 02**:项目练习(5天)
|
||||
|
||||
- 酒店管理系统
|
||||
@@ -36,7 +45,12 @@ iOS开发对硬件的要求较为严格,我们建议身边有Mac/iMac相关设
|
||||
- 通过Cocopods引入基本的第三方库对app进行优化
|
||||
- 通过代码对控件进行设置与页面搭建
|
||||
|
||||
**Task 03**:大作业Datawhale首页开发(4天)(可选)
|
||||
|
||||
- 故事板模块开发
|
||||
- 日历模块开发
|
||||
- 记录模块开发
|
||||
- 形成业务闭环
|
||||
|
||||
## iPad、Linux或Windows虚拟机
|
||||
|
||||
|
||||
@@ -1,34 +1,29 @@
|
||||
# Swift介绍与环境搭建
|
||||
|
||||
Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 在 Mac OS 和 iOS 平台可以和 Object-C 使用相同的运行环境。2015年6月8日,苹果于WWDC 2015上宣布,Swift将开放源代码,包括编译器和标准库。
|
||||
[TOC]
|
||||
|
||||
## 关于Swift
|
||||
|
||||
Swift 是一种非常好的编写软件的方式,无论是手机,台式机,服务器,还是其他运行代码的设备。它是一种安全,快速和互动的编程语言,将现代编程语言的精华和苹果工程师文化的智慧,以及来自开源社区的多样化贡献结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。
|
||||
> **Swift** 是一种非常好的编写软件的编程语言,无论是手机,台式机,服务器,还是其他运行代码的设备。它是一种安全,快速和互动的编程语言,将现代编程语言的精华和苹果工程师文化的智慧,以及来自开源社区的多样化贡献结合了起来。
|
||||
|
||||
Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览(playgrounds),这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
|
||||
|
||||
Swift 通过采用现代编程模式来避免大量常见编程错误:
|
||||
|
||||
- 变量始终在使用前初始化。
|
||||
- 检查数组索引超出范围的错误。
|
||||
- 检查整数是否溢出。
|
||||
- 可选值确保明确处理 `nil` 值。
|
||||
- 内存被自动管理。
|
||||
- 错误处理允许从意外故障控制恢复。
|
||||
|
||||
Swift 代码被编译和优化,以充分利用现代硬件。语法和标准库是基于指导原则设计的,编写代码的明显方式也应该是最好的。安全性和速度的结合使得 Swift 成为从 “Hello,world!” 到整个操作系统的绝佳选择。
|
||||
|
||||
Swift 将强大的类型推理和模式匹配与现代轻巧的语法相结合,使复杂的想法能够以清晰简洁的方式表达。因此,代码不仅更容易编写,而且易于阅读和维护。
|
||||
Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS 应用程序。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 在 Mac OS 和 iOS 平台可以和 Objective-C 使用相同的运行环境。2015年6月8日,苹果于WWDC 2015上宣布,Swift将开放源代码,包括编译器和标准库。
|
||||
### Swift好在哪
|
||||
- Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的系统编程语言。它支持代码预览(playgrounds),这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
|
||||
- Swift 将强大的类型推理和模式匹配与现代轻巧的语法相结合,使复杂的想法能够以清晰简洁的方式表达。因此,代码不仅更容易编写,而且易于阅读和维护。
|
||||
- Swift 代码被编译和优化,以充分利用现代硬件。语法和标准库是基于指导原则设计的,编写代码的明显方式也应该是最好的。安全性和速度的结合使得 Swift 成为从 “Hello,world!” 到整个操作系统的绝佳选择。
|
||||
- 编译器LLVM对Swift性能进行了优化,其性能平均比OC快30%左右;在开发阶段进行了优化,如字符串拼接、方法默认参数、面向协议编程、高阶函数等等很大程度上提高了开发效率。
|
||||
- Swift 通过采用现代编程模式来避免大量常见编程错误:
|
||||
- 变量始终在使用前初始化或解包,保证代码的安全性。
|
||||
- 检查数组索引超出范围的错误。
|
||||
- 检查整数是否溢出。
|
||||
- 可选值确保明确处理 `nil` 值。
|
||||
- 内存被自动管理。
|
||||
- 错误处理允许从意外故障控制恢复。
|
||||
|
||||
## 环境搭建
|
||||
|
||||
Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程序。
|
||||
|
||||
在正式开发应用程序前,我们需要搭建Swift开发环境,以便更好友好的使用各种开发工具和语言进行快速应用开发。由于Swift开发环境需要在OS X系统中运行,因此其环境的搭建将不同于Windows环境,下面就一起来学习一下Swift开发环境的搭建方法。
|
||||
> Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程序。
|
||||
> 在正式开发应用程序前,我们需要搭建Swift开发环境,以便更好友好的使用各种开发工具和语言进行快速应用开发。由于Swift开发环境需要在OS X系统中运行,因此其环境的搭建将不同于Windows环境,下面就一起来学习一下Swift开发环境的搭建方法。
|
||||
|
||||
成功搭建Swift开发环境的前提:
|
||||
|
||||
- 一台Mac/iMac 。因为集成开发环境XCode只能运行在OS X系统上。
|
||||
- 电脑系统必须在OS 10.9.3及以上。
|
||||
- 电脑必须安装Xcode集成开发环境。
|
||||
@@ -37,22 +32,34 @@ Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程
|
||||
|
||||
## 使用Xcode创建第一个程序
|
||||
|
||||
在App Store下载Xcode完毕后,双击运行:
|
||||
在App Store下载Xcode完毕后(这里以Xcode13为例),双击运行:
|
||||
|
||||
- 点击`Create a new Xcode project`
|
||||
|
||||
<img src="./images/1.png" alt="avatar" style="zoom:40%;" />
|
||||
|
||||
|
||||

|
||||
|
||||
- 选择`iOS`-`App`并`Next`
|
||||
|
||||
<img src="images/2.png" alt="2" style="zoom:33%;" />
|
||||

|
||||
> 这里代表你选择开发一个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`:
|
||||
|
||||
<img src="images/3.png" alt="3" style="zoom:33%;" />
|
||||
|
||||

|
||||
这里我们默认选择Swift语言,Interface选择Storyboard
|
||||
> **product name**:表示项目名
|
||||
> **Team** : 当前队伍,如果是团队合作开发或企业开发会有专属的Team
|
||||
> **Organization Identifier**:组织名
|
||||
> **Interface** :选择是在故事板开发还是SwiftUI开发,这里建议新手选择Interface,SwiftUI需要Swift基础才能选择
|
||||
> **Language** : 可以选择Swift与OC两种语言开发
|
||||
|
||||
- 初始页面如下,在左侧找到`ViewController.swift`,添加如下代码:
|
||||
|
||||
```swift
|
||||
@@ -76,29 +83,14 @@ Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程
|
||||
}
|
||||
}
|
||||
```
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
- 点击运行,结果如下:
|
||||
|
||||
<img src="images/5.png" alt="5" style="zoom:33%;" />
|
||||
- 点击运行,结果如下:
|
||||
|
||||
至此,我们完成了第一个iOS程序的搭建
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Xcode初探
|
||||
|
||||
对于初学者而言,Xcode中的storyboard提供了简单易懂的UI界面,我们可以在storyboard上搭建自己想要的界面。
|
||||
|
||||

|
||||
|
||||
双击编辑,输入Hello World!点击运行即可看到预览结果
|
||||
|
||||

|
||||
|
||||
除了Storyboard,Xcode还存在另一种启动方式:代码启动。在实际工程文件与开发过程中,Storyboard上堆砌大量空间会导致运行卡顿,因此本部分仅作为演示使用。
|
||||
对于初学者而言,Xcode中的storyboard提供了简单易懂的UI界面,我们可以在storyboard上搭建自己想要的界面。
|
||||
双击编辑,输入Hello World!点击运行即可看到预览结果
|
||||
除了Storyboard,Xcode还存在另一种启动方式:代码启动。在实际工程文件与开发过程中,Storyboard上堆砌大量空间会导致运行卡顿,因此本部分仅作为演示使用。
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# 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
|
||||
```
|
||||
|
||||
> 注意
|
||||
>
|
||||
> **注意**
|
||||
> 如果你的代码中有不需要改变的值,请使用 `let` 关键字将它声明为常量。只将需要改变的值声明为变量。
|
||||
|
||||
### 类型注解
|
||||
@@ -71,8 +70,7 @@ welcomeMessage = "Hello"
|
||||
var red, green, blue: Double
|
||||
```
|
||||
|
||||
> 注意
|
||||
>
|
||||
> **注意**
|
||||
> 一般来说你很少需要写类型注解。如果你在声明常量或者变量的时候赋了一个初始值,Swift 可以推断出这个常量或者变量的类型,请参考`类型安全和类型推断`。在上面的例子中,没有给 `welcomeMessage` 赋初始值,所以变量 `welcomeMessage` 的类型是通过一个类型注解指定的,而不是通过初始值推断的。
|
||||
|
||||
### 常量和变量的命名
|
||||
@@ -89,8 +87,7 @@ let 🐶🐮 = "dogcow"
|
||||
|
||||
一旦你将常量或者变量声明为确定的类型,你就不能使用相同的名字再次进行声明,或者改变其存储的值的类型。同时,你也不能将常量与变量进行互转。
|
||||
|
||||
> 注意
|
||||
>
|
||||
> **注意**
|
||||
> 如果你需要使用与 Swift 保留关键字相同的名称作为常量或者变量名,你可以使用反引号(`)将关键字包围的方式将其作为名字使用。无论如何,你应当避免使用关键字作为常量或变量名,除非你别无选择。
|
||||
|
||||
你可以更改现有的变量值为其他同类型的值,在下面的例子中,`friendlyWelcome` 的值从 `"Hello!"`改为了 `"Bonjour!"`:
|
||||
@@ -108,27 +105,22 @@ let languageName = "Swift"
|
||||
languageName = "Swift++"
|
||||
// 这会报编译时错误 - languageName 不可改变
|
||||
```
|
||||
|
||||
### 输出常量和变量
|
||||
|
||||
你可以用 `print(_:separator:terminator:)` 函数来输出当前常量或变量的值:
|
||||
|
||||
```swift
|
||||
print(friendlyWelcome)
|
||||
// 输出“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)。
|
||||
|
||||
Swift 用*字符串插值(string interpolation)*的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
|
||||
**Swift** 用*字符串插值(string interpolation)*的方式把常量名或者变量名当做占位符加入到长字符串中,**Swift** 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
|
||||
|
||||
```swift
|
||||
print("The current value of friendlyWelcome is \(friendlyWelcome)")
|
||||
// 输出“The current value of friendlyWelcome is Bonjour!”
|
||||
```
|
||||
|
||||
> 注意
|
||||
>
|
||||
> **注意**
|
||||
> 字符串插值所有可用的选项,请参考 [字符串插值](https://www.runoob.com/manual/gitbook/swift5/source/_book/chapter2/03_Strings_and_Characters.html#string_interpolation)。
|
||||
|
||||
## 注释
|
||||
@@ -769,4 +761,4 @@ precondition(index > 0, "Index must be greater than zero.")
|
||||
>
|
||||
> 如果你使用 unchecked 模式(-Ounchecked)编译代码,先决条件将不会进行检查。编译器假设所有的先决条件总是为 true(真),他将优化你的代码。然而,`fatalError(_:file:line:)` 函数总是中断执行,无论你怎么进行优化设定。
|
||||
>
|
||||
> 你能使用 `fatalError(_:file:line:)` 函数在设计原型和早期开发阶段,这个阶段只有方法的声明,但是没有具体实现,你可以在方法体中写上 fatalError("Unimplemented")作为具体实现。因为 fatalError 不会像断言和先决条件那样被优化掉,所以你可以确保当代码执行到一个没有被实现的方法时,程序会被中断。
|
||||
> 你能使用 `fatalError(_:file:line:)` 函数在设计原型和早期开发阶段,这个阶段只有方法的声明,但是没有具体实现,你可以在方法体中写上 fatalError("Unimplemented")作为具体实现。因为 fatalError 不会像断言和先决条件那样被优化掉,所以你可以确保当代码执行到一个没有被实现的方法时,程序会被中断。
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
# 基本运算符
|
||||
|
||||
*运算符*是检查、改变、合并值的特殊符号或短语。例如,加号(`+`)将两个数相加(如 `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 语言没有的区间运算符,例如 `a..<b` 或 `a...b`,这方便我们表达一个区间内的数值。
|
||||
|
||||
> *运算符*是检查、改变、合并值的特殊符号或短语。例如,加号(`+`)将两个数相加(如 `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 语言没有的区间运算符,例如 `a..<b` 或 `a...b`,这方便我们表达一个区间内的数值。
|
||||
本章节只描述了 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!`)。
|
||||
- *二元*运算符操作两个操作对象(如 `2 + 3`),是*中置*的,因为它们出现在两个操作对象之间。
|
||||
- *三元*运算符操作三个操作对象,和 C 语言一样,Swift 只有一个三元运算符,就是三目运算符(`a ? b : c`)。
|
||||
|
||||
受运算符影响的值叫*操作数*,在表达式 `1 + 2` 中,加号 `+` 是二元运算符,它的两个操作数是值 `1` 和 `2`。
|
||||
受运算符影响的值叫**操作数**,在表达式 `1 + 2` 中,加号 `+` 是二元运算符,它的两个操作数是值 `1` 和 `2`。
|
||||
|
||||
## 赋值运算符
|
||||
|
||||
*赋值运算符*(`a = b`),表示用 `b` 的值来初始化或更新 `a` 的值:
|
||||
**赋值运算符**(`a = b`),表示用 `b` 的值来初始化或更新 `a` 的值:
|
||||
|
||||
```swift
|
||||
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` 中:
|
||||
@@ -84,7 +79,7 @@ Swift 中所有数值类型都支持了基本的四则*算术运算符*:
|
||||
|
||||
你可以在 `9` 中放入两个 `4`,那余数是 1(用橙色标出)。
|
||||
|
||||
在 Swift 中可以表达为:
|
||||
在 **Swift** 中可以表达为:
|
||||
|
||||
```swift
|
||||
9 % 4 // 等于 1
|
||||
@@ -122,7 +117,7 @@ a = (b × 倍数) + 余数
|
||||
|
||||
### 一元负号运算符
|
||||
|
||||
数值的正负号可以使用前缀 `-`(即*一元负号符*)来切换:
|
||||
数值的正负号可以使用前缀 `-`(即**一元负号符**)来切换:
|
||||
|
||||
```swift
|
||||
let three = 3
|
||||
@@ -163,7 +158,7 @@ a += 2
|
||||
|
||||
## 比较运算符(Comparison Operators)
|
||||
|
||||
所有标准 C 语言中的*比较运算符*都可以在 Swift 中使用:
|
||||
所有标准 C 语言中的**比较运算符**都可以在**Swift**中使用:
|
||||
|
||||
- 等于(`a == b`)
|
||||
- 不等于(`a != b`)
|
||||
@@ -218,13 +213,12 @@ if name == "world" {
|
||||
("blue", false) < ("purple", true) // 错误,因为 < 不能比较布尔类型
|
||||
```
|
||||
|
||||
> 注意
|
||||
>
|
||||
> Swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
|
||||
> **注意**
|
||||
> **Swift** 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
|
||||
|
||||
## 三元运算符(Ternary Conditional Operator)
|
||||
|
||||
*三元运算符*的特殊在于它是有三个操作数的运算符,它的形式是 `问题 ? 答案 1 : 答案 2`。它简洁地表达根据 `问题`成立与否作出二选一的操作。如果 `问题` 成立,返回 `答案 1` 的结果;反之返回 `答案 2`的结果。
|
||||
**三元运算符**的特殊在于它是有三个操作数的运算符,它的形式是 `问题 ? 答案 1 : 答案 2`。它简洁地表达根据 `问题`成立与否作出二选一的操作。如果 `问题` 成立,返回 `答案 1` 的结果;反之返回 `答案 2`的结果。
|
||||
|
||||
三元运算符是以下代码的缩写形式:
|
||||
|
||||
@@ -265,7 +259,7 @@ if hasHeader {
|
||||
|
||||
## 空合运算符(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)
|
||||
|
||||
Swift 提供了几种方便表达一个区间的值的*区间运算符*。
|
||||
**Swift** 提供了几种方便表达一个区间的值的**区间运算符**。
|
||||
|
||||
### 闭区间运算符
|
||||
|
||||
*闭区间运算符*(`a...b`)定义一个包含从 `a` 到 `b`(包括 `a` 和 `b`)的所有值的区间。`a` 的值不能超过 `b`。
|
||||
**闭区间运算符**(`a...b`)定义一个包含从 `a` 到 `b`(包括 `a` 和 `b`)的所有值的区间。`a` 的值不能超过 `b`。
|
||||
|
||||
闭区间运算符在迭代一个区间的所有值时是非常有用的,如在 `for-in` 循环中:
|
||||
|
||||
@@ -324,7 +318,7 @@ for index in 1...5 {
|
||||
|
||||
### 半开区间运算符
|
||||
|
||||
*半开区间运算符*(`a..<b`)定义一个从 `a` 到 `b` 但不包括 `b` 的区间。 之所以称为*半开区间*,是因为该区间包含第一个值而不包括最后的值。
|
||||
**半开区间运算符**(`a..<b`)定义一个从 `a` 到 `b` 但不包括 `b` 的区间。 之所以称为**半开区间**,是因为该区间包含第一个值而不包括最后的值。
|
||||
|
||||
半开区间的实用性在于当你使用一个从 0 开始的列表(如数组)时,非常方便地从0数到列表的长度。
|
||||
|
||||
@@ -408,7 +402,7 @@ if !allowedEntry {
|
||||
|
||||
### 逻辑与运算符 #{logical_and_operator}
|
||||
|
||||
*逻辑与运算符*(`a && b`)表达了只有 `a` 和 `b` 的值都为 `true` 时,整个表达式的值才会是 `true`。
|
||||
**逻辑与运算符**(`a && b`)表达了只有 `a` 和 `b` 的值都为 `true` 时,整个表达式的值才会是 `true`。
|
||||
|
||||
只要任意一个值为 `false`,整个表达式的值就为 `false`。事实上,如果第一个值为 `false`,那么是不去计算第二个值的,因为它已经不可能影响整个表达式的结果了。这被称做*短路计算(short-circuit evaluation)*。
|
||||
|
||||
@@ -463,9 +457,8 @@ if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
|
||||
|
||||
前两种情况,我们都不满足,所以前两个简单逻辑的结果是 `false`,但是我们是知道紧急情况下重置的密码的,所以整个复杂表达式的值还是 `true`。
|
||||
|
||||
> 注意
|
||||
>
|
||||
> Swift 逻辑操作符 `&&` 和 `||` 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
|
||||
> **注意**
|
||||
> **Swift** 逻辑操作符 `&&` 和 `||` 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
|
||||
|
||||
### 使用括号来明确优先级
|
||||
|
||||
@@ -480,4 +473,4 @@ if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword
|
||||
// 输出“Welcome!”
|
||||
```
|
||||
|
||||
这括号使得前两个值被看成整个逻辑表达中独立的一个部分。虽然有括号和没括号的输出结果是一样的,但对于读代码的人来说有括号的代码更清晰。可读性比简洁性更重要,请在可以让你代码变清晰的地方加个括号吧!
|
||||
这括号使得前两个值被看成整个逻辑表达中独立的一个部分。虽然有括号和没括号的输出结果是一样的,但对于读代码的人来说有括号的代码更清晰。可读性比简洁性更重要,请在可以让你代码变清晰的地方加个括号吧!
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 字符串和字符
|
||||
|
||||
[TOC]
|
||||
*字符串*是是一系列字符的集合,例如 `"hello, world"`,`"albatross"`。Swift 的字符串通过 `String`类型来表示。而 `String` 内容的访问方式有多种,例如以 `Character` 值的集合。
|
||||
|
||||
Swift 的 `String` 和 `Character` 类型提供了一种快速且兼容 Unicode 的方式来处理代码中的文本内容。创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。通过 `+` 符号就可以非常简单的实现两个字符串的拼接操作。与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。你可以在已有字符串中插入常量、变量、字面量和表达式从而形成更长的字符串,这一过程也被成为字符串插值。尤其是在为显示、存储和打印创建自定义字符串值时,字符串插值操作尤其有用。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 集合类型
|
||||
|
||||
[TOC]
|
||||
Swift 语言提供 `Arrays`、`Sets` 和 `Dictionaries` 三种基本的*集合类型*用来存储集合数据。数组(Arrays)是有序数据的集。集合(Sets)是无序无重复数据的集。字典(Dictionaries)是无序的键值对的集。
|
||||
|
||||

|
||||
@@ -641,4 +641,4 @@ let airportNames = [String](airports.values)
|
||||
// airportNames 是 ["Toronto Pearson", "London Heathrow"]
|
||||
```
|
||||
|
||||
Swift 的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的 `keys` 或 `values` 属性使用 `sorted()` 方法。
|
||||
Swift 的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的 `keys` 或 `values` 属性使用 `sorted()` 方法。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 控制流
|
||||
|
||||
[TOC]
|
||||
Swift 提供了多种流程控制结构,包括可以多次执行任务的 `while` 循环,基于特定条件选择执行不同代码分支的 `if`、`guard` 和 `switch` 语句,还有控制流程跳转到其他代码位置的 `break` 和 `continue` 语句。
|
||||
|
||||
Swift 还提供了 `for-in` 循环,用来更简单地遍历数组(Array),字典(Dictionary),区间(Range),字符串(String)和其他序列类型。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 函数
|
||||
|
||||
[TOC]
|
||||
*函数*是一段完成特定任务的独立代码片段。你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时候“调用”这个函数来完成它的任务。
|
||||
|
||||
Swift 统一的函数语法非常的灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值将被修改。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 闭包
|
||||
|
||||
[TOC]
|
||||
*闭包*是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数(Lambdas)比较相似。
|
||||
|
||||
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为*包裹*常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。
|
||||
@@ -417,4 +417,4 @@ for customerProvider in customerProviders {
|
||||
// 打印“Now serving Daniella!”
|
||||
```
|
||||
|
||||
在上面的代码中,`collectCustomerProviders(_:)` 函数并没有调用传入的 `customerProvider` 闭包,而是将闭包追加到了 `customerProviders` 数组中。这个数组定义在函数作用域范围外,这意味着数组内的闭包能够在函数返回之后被调用。因此,`customerProvider` 参数必须允许“逃逸”出函数作用域。
|
||||
在上面的代码中,`collectCustomerProviders(_:)` 函数并没有调用传入的 `customerProvider` 闭包,而是将闭包追加到了 `customerProviders` 数组中。这个数组定义在函数作用域范围外,这意味着数组内的闭包能够在函数返回之后被调用。因此,`customerProvider` 参数必须允许“逃逸”出函数作用域。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 枚举
|
||||
|
||||
[TOC]
|
||||
*枚举*为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。
|
||||
|
||||
如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。
|
||||
@@ -345,4 +345,4 @@ print(evaluate(product))
|
||||
// 打印“18”
|
||||
```
|
||||
|
||||
该函数如果遇到纯数字,就直接返回该数字的值。如果遇到的是加法或乘法运算,则分别计算左边表达式和右边表达式的值,然后相加或相乘。
|
||||
该函数如果遇到纯数字,就直接返回该数字的值。如果遇到的是加法或乘法运算,则分别计算左边表达式和右边表达式的值,然后相加或相乘。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# 结构体和类
|
||||
|
||||
[TOC]
|
||||
*结构体*和*类*作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常量、变量和函数的语法,为你的结构体和类定义属性、添加方法。
|
||||
|
||||
与其他编程语言所不同的是,Swift 并不要求你为自定义的结构体和类的接口与实现代码分别创建文件。你只需在单一的文件中定义一个结构体或者类,系统将会自动生成面向其它代码的外部接口。
|
||||
@@ -247,4 +247,4 @@ if tenEighty === alsoTenEighty {
|
||||
|
||||
### 指针
|
||||
|
||||
如果你有 C,C++ 或者 Objective-C 语言的经验,那么你也许会知道这些语言使用*指针*来引用内存中的地址。Swift 中引用了某个引用类型实例的常量或变量,与 C 语言中的指针类似,不过它并不直接指向某个内存地址,也不要求你使用星号(`*`)来表明你在创建一个引用。相反,Swift 中引用的定义方式与其它的常量或变量的一样。如果需要直接与指针交互,你可以使用标准库提供的指针和缓冲区类型 —— 参见 [手动管理内存](https://developer.apple.com/documentation/swift/swift_standard_library/manual_memory_management)。
|
||||
如果你有 C,C++ 或者 Objective-C 语言的经验,那么你也许会知道这些语言使用*指针*来引用内存中的地址。Swift 中引用了某个引用类型实例的常量或变量,与 C 语言中的指针类似,不过它并不直接指向某个内存地址,也不要求你使用星号(`*`)来表明你在创建一个引用。相反,Swift 中引用的定义方式与其它的常量或变量的一样。如果需要直接与指针交互,你可以使用标准库提供的指针和缓冲区类型 —— 参见 [手动管理内存](https://developer.apple.com/documentation/swift/swift_standard_library/manual_memory_management)。
|
||||
|
||||
BIN
IOS/Task00:Swift基础语法学习/images/1637228746939.png
Normal file
BIN
IOS/Task00:Swift基础语法学习/images/1637228746939.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
BIN
IOS/Task00:Swift基础语法学习/images/1637228788344.png
Normal file
BIN
IOS/Task00:Swift基础语法学习/images/1637228788344.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
BIN
IOS/Task00:Swift基础语法学习/images/1637230229308.png
Normal file
BIN
IOS/Task00:Swift基础语法学习/images/1637230229308.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
@@ -1,5 +1,5 @@
|
||||
# Windows 系统下安装 macOS
|
||||
|
||||
[TOC]
|
||||
由于 iOS 开发必须使用 XCode,而 XCode 又必须运行在 macOS 上,因此为了让使用 Windows 系统的朋友们也能进行 iOS 开发,我们将在 Windows 上通过虚拟机安装 macOS。
|
||||
|
||||
## 安装 VMware
|
||||
@@ -102,4 +102,4 @@ https://github.com/paolo-projects/unlocker/releases
|
||||
|
||||
随后等待安装完毕,重新启动即可正常使用。随后,在 App Store 中下载 Xcode 即可进行开发:
|
||||
|
||||

|
||||

|
||||
|
||||
Reference in New Issue
Block a user