Swift-21-程序逻辑控制

swift语言的逻辑控制比一般的语言要复杂的多,它在原有的if, while基本上又增加了很多新功能。这些需要仔细研究下

循环结构

在switf中有两种循环:for和while

for 循环

for…in

//简单示例,正常打印5次
var myFirstInt = 0
for i in 1...5 { //正常写法是 for i: Int in 1...5
    print(myFirstInt + i)
} //~~ 1, 2, 3, 4, 5

//也可写成这样,用_通配符代替,但这样就取不到每次迭代的值了
for _ in 1...5 {
    print(myFirstInt)
}

where子句

//where子句,相当于对每次特殊的值加了一个筛选条件。下例表示:从100个数中取得能整除3的数字
for i in 1...100 where i % 3 == 0 {
    print(i)
}

while循环

while…do

// while...do写法
var i = 1
while i < 6 {
    print(i)
    i += 1
}

repeat…while(do…while)

在其它语言中称为do…while,即先执行一次再看是否再次执行;

var shields = -1;
repeat {
    print("Fire blasters!")
} while shields > 0

break和continue

  • break:跳出当前整体循环;
  • continue:跳过本次循环从头开始,和其它语言的continue意思一样;

一个稍复杂的例子

var shields = 5 //护盾强度
var blastersOverheating = false //武器是否需要冷却
var blasterFireCount = 0 //武器开火次数
var spaceDemonsDestroyed = 0 //击杀怪物的总数量
while shields > 0 {
    if spaceDemonsDestroyed == 5 {
        print("You beat the game!")
        break
    }
    print(blastersOverheating);
    //检查武器是否过热
    if blastersOverheating {
        print("Blasters are overheated!  Cooldown initiated.")
        blastersOverheating = false
        blasterFireCount = 0
        continue //从这就打断了循环,从头开始了
    }
    
    //检查开火次数,达到一定3次时,要设置标志位冷却下武器
    if blasterFireCount > 2 {
        blastersOverheating = true
        continue //从这就打断了循环,从头开始了
    }
    
    print("Fire blasters!")
    blasterFireCount += 1
    spaceDemonsDestroyed += 1
}
/*
    Fire blasters!
    Fire blasters!
    Fire blasters!
    Blasters are overheated!  Cooldown initiated.
    Fire blasters!
    Fire blasters!
    You beat the game!
 */

以上语句都可以混合break和continue一起使用。

选择结构

if 选择

if…else

语法关键字:if、 else以及 else if。

    var message: String
    var hasPostOffice: Bool = true
    
    if (population < 10000) {
        message = "\(population) is a small town!"
    } else if (population >= 10000 && population < 50000) {
        message = "\(population) is a medium town!"
    } else {
        message = "\(population) is pretty big!"
    }

if case

这种写法完全可以用if…else或switch来代替,属于一个中间品,也是swift语言等有的,用处不大,了解下即可。

let age = 25
if case 18...35 = age {
    print("Cool demographic")
}

if case 18...35 = age, age >= 21 {
    print("In cool demographic and of drinking age")
}

//~~ Cool demographic
//~~ In cool demographic and of drinking age

guard(if返例)

与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。其语法结构如下:

guard expression else { 
    //语句
    //必须包含一个控制语句:return,break,continue或throw。
}
  • 如果对表达式求值false,guard则执行代码块内的语句。
  • 如果对表达式求值true,guard则从执行中跳过代码块内的语句
guard let username = usernameTextField.text, !username.isEmpty else {
    show("用户名不能为空")
    return
}
guard let password = passwordTextField.text, !password.isEmpty else {
    show("密码不能为空")
    return
}
register(username, password)

switch 选择

可以接受整型和枚举,先看一个简单的例子

var statusCode: Int = 420
var errorString: String = "The request failed:"

switch statusCode {
    case 400:
       errorString += "bad Request, \(statusCode)."
    case 500:
       errorString += "server error, \(statusCode)."
    default:
        errorString += "unknown, \(statusCode)."
}
print(errorString) //~~The request failed:unknown, 420.

case组合

如果多个错误码对应同一个错误信息时,可以像下面这样来写

var statusCode: Int = 520
var errorString: String = "The request failed:"

switch statusCode {
    case 400:
       errorString += "bad Request, \(statusCode)."
    case 500, 510, 520, 530:
       errorString += "server error, \(statusCode)."
    default:
        errorString += "unknown, \(statusCode)."
}
print(errorString) //~~The request failed:server error, 520.

case区间

上面采用罗列的方式是比原始简单了一些,但如果有上百个值的话,那么写起来也是很费劲的,所以switch又提供了区间的功能,其格式为:

  • intStart…intEnd:如300…600,表示300到600间所有的整数;
var statusCode: Int = 520
switch statusCode {
    case 400:
       errorString += "bad Request, \(statusCode)."
    case 500, 510, 520, 530:
       errorString += "server error, \(statusCode)."
    case 600...800:
       errorString += "nginx error, \(statusCode)."
    default:
        errorString += "you must fix it."
}
print(errorString) //~~The request failed:server error, 520.

fallthrough

在switch的switch语句中不需要使用break语句,都是隐式设置的。另外它又新增了一个叫fallthrough的关键字,不太好解释其作用,直接看例子可能更直观。

var statusCode: Int = 520
switch statusCode {
    case 400:
       errorString += "bad Request, \(statusCode)."
    case 500, 510, 520, 530:
       errorString += "server error, \(statusCode)."
       fallthrough
    default:
        errorString += "you must fix it."
}
print(errorString) //~~The request failed:server error, 520.you must fix it.

另外一个例子

var statusCode: Int = 520
var errorString: String = "The request failed:"

switch statusCode {
    case 400:
       errorString += "bad Request, \(statusCode)."
    case 500, 510, 520, 530:
       errorString += "server error, \(statusCode)."
       fallthrough
    case 600:
       errorString += "server error, \(statusCode)."
    default:
        errorString += "you must fix it."
}
print(errorString) //~~The request failed:server error, 520. server error, 520.

仔细查看以上代码输出:

  • break:默认会加在每个case代码块的最末尾,如果匹配就跳出整个switch语句;
  • fallthrough:它会无条件执行它下一个case语句,无论是否匹配上;

swift中的switch比其它语言要复杂一点,它可以动态运算。正常case的值可接受String、Int类型的数字以及Enum枚举全可以,需要注意的是在case语句默认带了break
(也可以显式的写break),如果想用continue,则需要用关键字fallthrough来代替。标准写法格式如下面代码所示:

var statusCode: Int = 420
var errorString: String = "The request failed:"
switch statusCode {
//多case值
case 100, 101:
    errorString += " Informational, \(statusCode)." //statusCode是一个变量引用
    
case 204:
    errorString += " Successful but no content, \(statusCode)."
    fallthrough //代替了continue
default:
    errorString = "Unknown error encountered."
    break  //可以省略
}

值绑定

值绑定能在某个特定分支中把待匹配的值绑定(bind)到本地的常量或变量上。这个常量或变量只能在该分支中使用。可以用var或let来定义。

var statusCode: Int = 900
var errorString: String = "The request failed:"
switch statusCode {
case 100, 101:
    errorString += " Informational, \(statusCode)."
    
case 300...307:
    errorString += " Redirection, \(statusCode)."
    
case 400...417:
    errorString += " Client error, \(statusCode)."

case let unknownCode:
    errorString = "\(unknownCode) Unknown error encountered."

default :
    errorString = "Unknown error encountered." //不会执行    
}   
print(errorString) //~~900 Unknown error encountered.

这里的unknownCode虽然没有初始化,但默认它的值就是前面swith的值(statusCode),在这个例子中此值为900;所以打印出的结果为"900 Unknown error encountered."。

上述这种写法可以代替default语句。如果同时存在default语句,又如果都能匹配上case,则default不会执行。

where子句

where子句其实就是对值绑定语句的一次细化,表示从已匹配的值中再刨除掉一部分值。

var statusCode: Int = 620
var errorString: String = "The request failed:"
switch statusCode {
case 100, 101:
    errorString += " Informational, \(statusCode)."
    
case 204:
    errorString += " Successful but no content, \(statusCode)."
    
case 300...307:
    errorString += " Redirection, \(statusCode)."
    
//匹配除了前面三个case值外,如果程序运行到这里了,则只匹配:200~300或大于505的值
case let unknownCode where (unknownCode >= 200 && unknownCode < 300) || unknownCode > 505:
    errorString = "\(unknownCode) is not a known error code."
    
default:
    errorString = "Unknown error encountered."
}
print(errorString)
//~~statusCode=620时,620 is not a known error code.
//~~statusCode=420时,Unknown error encountered.

元组匹配

正常来讲case只是一个值,在swift中可以指定多个值。在实际中适用于逻辑关联有两个或多个值的情况,其实这种便利也可以用一步计算得出,然后再在switch中匹配计算出来的值。

let firstErrorCode = 404
let secondErrorCode = 200
let errorCodes = (firstErrorCode, secondErrorCode)

switch errorCodes {
case (404, 404):
    print("No items found.")
case (404, _):     // _ 表示匹配任意值
    print("First item not found.")
case (_, 404):
    print("Second item not found.")
default:
    print("All items found.")
}

//~~First item not found.

元组操作

//不带名称的元组
let firstErrorCode = 404
let secondErrorCode = 200
let errorCodes = (firstErrorCode, secondErrorCode)
print(errorCodes.0)
print(errorCodes.1)

//带名称的元组
let firstErrorCode = 404
let secondErrorCode = 200
let errorCodes = (first: firstErrorCode, second: secondErrorCode)
print(errorCodes.first)
print(errorCodes.second)

运算符

  1. 四则运算: +、 -、 *、 \、 %、++、–
  2. -(负号)
  3. 赋值运算:=、+=、-=、/=、*=
  4. 三元运算符:condition ? expression1: expression2
  5. 位运算:&、 |、 ^、 ~(求反)、 << 、>>
  6. 关系运算:==、!=、< 、 > 、 <= 、 >=
  7. 引用运算:=、! 计算两个实例是否指向同一个引用
  8. 溢出运算:&+、 &-、 &*、 &\(不太建议使用)
  9. 可空类型运算:??

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/556160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

遥感图像分割 | 基于一种类似UNet的Transformer算法实现遥感城市场景图像的语义分割_适用于卫星图像+航空图像+无人机图像

项目应用场景 面向遥感城市场景图像语义分割场景&#xff0c;项目采用类似 UNet 的 Transformer 深度学习算法来实现&#xff0c;项目适用于卫星图像、航空图像、无人机图像等。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装依赖 conda create -n airs python3.8…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304)&#xff0c;但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下&#xff1a; 解决方案 PyCharm会自动识别出来flask项目&#xff08;即使你…

24位AD分辨率、256Ksps*16通道国产数据采集卡、uV级采集、支持IEPE

24位AD分辨率、256Ksps*16通道、uV级采集、USB数据传输、支持IEPE、C、LABVIEW、MATLAB、Python等多编程语言&#xff0c;提供例程&#xff0c;支持二次开发。 XM7016-以太网采集卡 XM7016是一款以太网型高速数据采集卡&#xff0c;具有16通道真差分输入&#xff0c;24位分辨率…

互联网技术底蕴探究 | 联网通信原理精析与网络协议通信机制

联网通信原理精析与网络协议入门导览 前提介绍网络网络结构与节点网络应用Sun公司的Jini技术 网络设备网卡&#xff08;Netword Card&#xff09;以太网卡 路由器&#xff08;Router&#xff09;处理数据模式安全控制访问 集线器&#xff08;Hub&#xff09;网关&#xff08;Ga…

CSS的语法规则——基础选择器

元素&#xff1a; 用法&#xff1a; 标签名&#xff1a;{style的内容} 特点&#xff1a; 全局性&#xff0c;使用后&#xff0c;所有的相同标签都是同一种样式。 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

【Linux冯诺依曼体系结构】

目录 1.冯诺依曼体系结构原理 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元&#…

【个人博客搭建】(9)使用日志

net自带日志与Serilog。 1、比较。net 8 webapi使用自带的日志功能与Serilog日志的异同&#xff0c;性能上有多少差距 在.NET 8 WebAPI中&#xff0c;使用自带的日志功能与使用Serilog日志框架存在一些异同。性能上的差距取决于具体的使用场景和配置&#xff0c;但通常Serilog…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法,其主要目的是将数据点划分为K个集群,以使得每个数据点与其所属集群的中心点(质心)的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。 二、K-means算法的基本原理 K-means算法…

source map 开发优化工具

什么是 Source map 简单来说 Source map 就是一个存储信息的文件&#xff0c;里面储存着位置信息。 Source map 英文释义&#xff1a;源程序映射。 位置信息&#xff1a;转换后的代码 对应的 转换前的代码 位置映射关系。 有了 Source map&#xff0c;就算线上运行的是转换…

大型网站系统架构演化实例_2.使用缓存改善网站性能

1.使用缓存改善网站性能 网站访问的特点和现实世界的财富分配一样遵循二八定律&#xff1a;80%的业务访问集中在20%的数据上。既然大部分业务访问集中在一小部分数据上&#xff0c;那么如果把这一小部分数据缓存在内存中&#xff0c;就可以减少数据库的访问压力&#xf…

深入剖析Tomcat(三) 实现一个简易连接器

Tomcat中的servlet容器叫做Catalina&#xff0c;Catalina有两个主要模块&#xff1a;连接器与容器。在本章&#xff0c;将会建立一个连接器来增强第二章中应用程序的功能&#xff0c;用一种更好的方式来创建request与response对象。 截止文章编写日期&#xff0c;servlet规范已…

docker 启动时报错

docker 启动时报如下错误 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details 因为安装docker时添加了镜像源 解决方案&#xff1a; mv /etc/…

学习部分排序,插入排序,冒泡排序以及希尔排序

1.插入排序 <1>.首先我们举个例子 我们要把6进行前面的插入&#xff0c;那我们要进行比较&#xff0c;首先确定一个end的指针&#xff0c;然后他指向的数字就是我们需要比较的&#xff0c;如果end指向的数比我们end1 的大的话&#xff0c;那我们就往前挪一个&#xff0c…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …

读所罗门的密码笔记21_读后总结与感想兼导读

1. 基本信息 所罗门的密码&#xff1a;AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字&#xff0c;笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …

Java垃圾回收1

1.对象什么时候可以被垃圾器回收 1.垃圾回收的概念 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c; 在Java语言中&#xff0c;有了自动的垃圾回收机制&#xff0c;也就是我们熟悉的GC(Garbage Collection)。 有了垃圾…

python中的守护进程、僵尸进程、孤儿进程

继续上一篇文章的探讨&#xff1a;https://blog.csdn.net/weixin_39743356/article/details/137885419 守护进程 守护进程&#xff08;Daemon Process&#xff09;是一种在后台运行的特殊类型的进程&#xff0c;它独立于控制终端&#xff0c;并且周期性地执行某种任务或等待处…

本地部署 Meta Llama3-8b 和 Llama3-70b

本地部署 Meta Llama3-8b 和 Llama3-70b 0. 引言1. Meta对Llama 3的目标2. Llama 3的性能3. 下载和安装 Ollama4. 使用 Ollama 运行 Llama3 0. 引言 今天&#xff0c;Meta 正式介绍Meta Llama 3&#xff0c;Meta 开源大型语言模型的下一代产品。 这次发布包括具有80亿&#xf…

数据可视化(四):Pandas技术的高级操作案例,豆瓣电影数据也能轻松分析!

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…
最新文章