Swift 5.9 中 if 与 switch 语句简洁新语法让撸码更带劲

在这里插入图片描述

概览

在实际代码开发中,可能初学 Swift 语言的小伙伴们在撸码时最常用的得数 if 和 switch…case 条件选择语句了。不过在某些场景下它们显得略有那么一丢丢“矫揉造作”,还好从 Swift 5.9 开始苹果知趣的为其简化了语法且增强了它们的表现力。

在本篇博文中,您将学到如下内容:

  • 概览
  • 1. Swift 中的 if 和 switch 条件语句
  • 2. 三元操作符(ternary expression)
  • 3. Swift 5.9 if 与 switch 简洁的新语法
  • 4. 新语法的“美中不足”
  • 总结

在这里插入图片描述

“九尺之台起于垒土,千里之行始于足下”,Swift 语言里 if 和 switch…case 语句是任何绝妙 App 搭建的“盘石桑苞”!

那小伙伴们还等什么呢?让我们马上开始燥起来吧!

Let‘s go!!!😃


1. Swift 中的 if 和 switch 条件语句

在任何语言的结构化编程模式中条件与分支判断一直是当仁不让的“绝对核心”,这对于 Swift 语言自然也不例外。

在 Swift 语言中我们可以使用 if…else 语句来表达一般的条件与分支判断逻辑:

if tooBig {reductIt()
} else {usingIt()
}

我们还可以使用 else 子句进一步拓展 if 语句来匹配多种条件:

var number = 11if number == 0 {print("Zero!!!")
} else if number < 0 {print("小于零")
} else if number >= 100 && number < 1000 {print("大于等于 100,且小于1000")
} else {print("\(number) 其它情况")
}

当然,我们也可以用 switch…case 重构上面的 if…else 代码:

switch number {
case 0:print("Zero!!!")
case ..<0:print("小于零")
case 100..<1000:print("大于等于 100,且小于1000")
default:print("\(number) 其它情况")
}

在 Swift 语言中我们同样可以用 if + let 语句的组合来快速捕获可选值(Optional):

var name: String? = "大熊猫侯佩"if let name = name {print("\(name)")
}

从 Swift 5.7 开始,苹果对于上述代码提供了更简洁的语法:

var name: String? = "大熊猫侯佩"if let name {print("\(name)")
}

更进一步,if 语句还可以搭配 case 组合成 if case let 模式匹配语句:

enum MyError: Error {case textTooShort(actual: Int, min: Int)
}let MIN_LEN = 5
let text = "wo"do {if text.count < MIN_LEN {throw MyError.textTooShort(actual: text.count, min: MIN_LEN)}
} catch let my_error as MyError {if case MyError.textTooShort(let actual, let min) = my_error {print("输入文字长度(\(actual))太短了,不能小于(\(min))")} else {print("其它 MyError: \(my_error)")}
} catch {print("Other ERR: \(error)")
}

在上面的代码中,我们使用模式匹配 if case let 语句优雅的将特定错误所绑定的信息解析了出来。

关于 Swift 中模式匹配的进一步详细介绍请小伙伴们移步如下博文观赏:

  • Swift 入门之自定义类型的模式匹配(Pattern Matching)
  • Swift 初学者趣谈:一招教你记住模式匹配 if case let 的语法,永不忘记

2. 三元操作符(ternary expression)

然而,在某些简单情况下我们希望条件选择语句越简约越好,比如在下面的例子中我们利用 if…else 语句依照条件(isNeedShortName)的不同值产生了对应不同的 personName 变量,一个 personName 要写 3 遍,这你们也能忍?

struct Person {var name: Stringvar shortName: String
}let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true// personName 变量名称多次出现,略显冗余
let personName: String
if isNeedShortName {personName = hopy.shortName
} else {personName = hopy.name
}

所幸的是和其它语言类似,Swift 也提供了三元操作符(ternary expression)来简化条件选择逻辑:

let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true
let personName = isNeedShortName ? hopy.shortName : hopy.name

可以看到使用三元操作符让原来繁琐的代码变得“轻骑减从”了。但是因为三元操作符将全部逻辑都放在同一行中,过度使用它有可能让代码变得更加晦涩难懂。

这又该如何是好呢?


更多关于 Swift 基础指令、操作符和语法的系统性学习,请小伙伴们来我的博客专栏恣意吸取养分:

在这里插入图片描述

  • Swift 语言开发精讲

3. Swift 5.9 if 与 switch 简洁的新语法

前文提到了滥用三元操作符可能出现的一些弊端。

不过别着急,从 Swift 5.9 开始苹果精简和完善了 if 与 switch 的语法,让条件选择既能层次分明又能言简意赅:

let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {hopy.shortName
} else {hopy.name
}

从上面代码可以看出:新语法让秃头码农们只需书写一次 personName 变量。我们硬是将 if…else 语法写出了三元操作符的“小鸟依人”,同时做到了楚楚有致,这让我们怎能“云胡不喜”呢?

新语法同样也可以用在 switch…case 语句上:

enum Size {case small, mid, big
}let size = Size.midlet sizeDesc = switch size {
case .small:"小号"
case .mid:"中号"
case .big:"大号"
}

Swift 5.9 中新语法除了对寻常条件判断表达式的简化“有如神助”以外,我们还可以进一步如法炮制利用它们来精简其它类似的逻辑:

struct Msg {var emergencyDegree = 0var msgColor: Color {switch emergencyDegree {case 0..<5:.graycase 5..<10:.greencase 10..<15:.yellowcase 15..<20:.orangedefault:.red}}
}let msg = Msg(emergencyDegree: 20)
print(msg.msgColor)

比如在上面的代码中,Swift 5.9 新语法在 msgColor 计算属性的定义中为我们解囊相助省去了海量的 return 语句,就问你们赞不赞!?

4. 新语法的“美中不足”

虽然 Swift 5.9 新语法很好很强大,但是目前对于 if 相关的语法还是有一些“限制”的。

首先 if 必须带上 else 子句。

不过,想想这也合情合理,如若不然我们就无法顾及到每种可能的条件了。

另一个局限是新 if 语句中不能出现多行代码,比如下面示例就无法通过编译:

let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {print("for short name")hopy.shortName
} else {print("for full name")hopy.name
}

关于该特性孰是孰非的全面讨论,请大家移步到苹果官方开发者论坛边吃瓜边观赏“神仙打架”:

  • discussion about this on the Swift Forums

至此,我们彻底弄明白了 Swift 5.9 中新条件选择语法带来的巨大便利,借助于他的东风我们又可以愉快的进行撸码造福世界人民了,棒棒哒!💯

总结

在本篇博文中,我们介绍了 Swift 语言中条件选择指令的“前世今生”,并讨论了 Swift 5.9 中 if 和 switch 语句更简洁的新语法。

感谢观赏,再会!😎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vitis HLS 学习笔记--优化本地存储器访问瓶颈

目录 1. 简介 2. 代码解析 2.1 原始代码 2.2 优化后 2.3 分析优化措施 3. 总结 1. 简介 在Vitis HLS中&#xff0c;实现II&#xff08;迭代间隔&#xff09; 1是提高循环执行效率的关键。II1意味着每个时钟周期都可以开始一个新的迭代&#xff0c;这是最理想的情况&…

HNCTF ——baby_python

H&NCTF 2024 官方WP (qq.com) OpCodes Pickle.jl (juliahub.com) nc之后 PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33267 # Python 3.10.12 from pickle import loads main b"\x80\x04ctypes\nFunctionType\n(ctypes\nCodeType\n(I1\nI0\nI0\n…

【Vim】

一、什么是Vim&#xff1f; Vim 是一个历史悠久的文本编辑器&#xff0c;可以追溯到 qed。 Bram Moolenaar 于 1991 年发布初始版本。Vim 有着悠久的历史;它起源于 Vi 编辑器&#xff08;1976 年&#xff09;&#xff0c;至今仍在开发中。(Vim has a rich history; it origina…

css+html 爱心❤

效果 代码实现 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

MySQL第一次作业(基本操作)

目录 一、登陆数据库 二、创建数据库zoo 三、修改数据库zoo字符集为gbk 四、选择当前数据库为zoo 五、查看创建数据库zoo信息 六、删除数据库zoo 一、登陆数据库 指令&#xff1a; mysql -u root -p 二、创建数据库zoo 指令&#xff1a; create database zoo; 三、修改数…

基于PHP+MySQL组合开发的多用户自定义商城系统源码 附带源代码包以及搭建教程

系统概述 互联网技术的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。商城系统作为电子商务的核心&#xff0c;其开发技术和用户体验直接影响着电商平台的竞争力和用户满意度。本文旨在介绍一个基于PHPMySQL组合开发的多用户自定义商城系统&#xff0c;…

C++学习~~string类

1.STL简单介绍 &#xff08;1&#xff09;标准模版库&#xff0c;是C里面的标准库的一部分&#xff0c;C标准库里面还有其他的东西&#xff0c;但是我们不经常使用&#xff0c;我们经常使用的还是STL这个标准库部分。 &#xff08;2&#xff09;六大件&#xff1a;仿函数&…

C# WinForm —— 16 MonthCalendar 介绍

1. 简介 可以选择单个日期&#xff0c;也可以选择一段日期&#xff0c;在选择时间范围上 比较适用&#xff0c;但不能跨月份选择日期范围 在直观上&#xff0c;可以快速查看、选择日期/日期范围 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般…

Uni-app基础知识

uni-app组成和跨端原理 | uni-app官网uni-app,uniCloud,serverless,uni-app组成和跨端原理,基本语言和开发规范,编译器,运行时&#xff08;runtime&#xff09;,逻辑层和渲染层分离https://uniapp.dcloud.net.cn/tutorial/1.adb连接模拟器 找到adb所在位置&#xff08;一般在hb…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

对称加密算法的应用场景

随着信息技术的飞速发展&#xff0c;数据安全成为了至关重要的议题。在保护数据传输和存储的过程中&#xff0c;加密算法扮演着不可或缺的角色。其中&#xff0c;对称加密算法&#xff0c;由于其高效性和易用性&#xff0c;被广泛应用于各种场景中。本文将探讨对称加密算法的主…

Kubernets多master集群构建负载均衡

前言 在构建 Kubernetes 多 Master 集群时&#xff0c;实现负载均衡是至关重要的一环。通过多台 Master 节点配合使用 Nginx 和 Keepalived 等工具&#xff0c;可以有效提高集群的可靠性和稳定性&#xff0c;确保系统能够高效运行并有效应对故障。接下来将介绍如何配置这些组件…

物业水电抄表系统的全面解析

1.系统概述 物业水电抄表系统是现代物业管理中的重要组成部分&#xff0c;它通过自动化的方式&#xff0c;实时监控和记录居民或企业的水电使用情况&#xff0c;极大地提高了工作效率&#xff0c;降低了人工抄表的错误率。该系统通常包括数据采集、数据传输、数据分析和数据展…

链表OJ题(移除链表元素,反转链表,分割链表,环形链表(是否成环问题),链表中间节点(快慢指针讲解),环形链表(找入环节点))“题目来源力扣附带题目链接”

目录 1.移除链表元素 2.反转链表 2.1三指针法 2.2头插法 3.分割链表 4.链表的中间节点&#xff08;快慢指针&#xff09; 4.1快慢指针 4.2求链表的中间节点 5.环形链表 5.1环形链表是否成环 5.2环形链表入环节点 5.3入环节点推论的不完备性说明 1.移除链表元素 移除…

Microsoft Threat Modeling Tool 使用(三)

Boundary&#xff08;边界&#xff09; 本文介绍信任边界&#xff0c;基于 SDL TM Knowledge Base (Core) 模版&#xff0c;这是一个通用的威胁建模模板&#xff0c;非常适合初学者和大多数威胁建模需求。 这些边界&#xff08;Boundary&#xff09;在微软威胁建模工具中用于表…

Java多线程与高并发

1、什么是进程?什么是线程? 进程:进程是程序的基本执行实体;另外一种解释是进程是一个应用程序(1个进程是一个软件)。 线程:线程是操作系统能够进行运算调度的最下单位。它被包含在进程之中,是进程中的实际运作单位;是一个进程中的执行场景/执行单元。 注意:。一个进…

在云服务器上运行StyleGAN3生成伪样本

首先是传入数据&#xff0c;这里我们不做赘述。 对于数据格式的裁剪&#xff0c;可以通过以下代码进行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

【Oracle篇】rman物理备份工具的基础理论概述(第一篇,总共八篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

嵌入式是大坑的说法,是否与学生的信息不对称有关?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 目前也算是在搞嵌入式&#…

【深度学习】时空图卷积网络(STGCN),预测交通流量

论文地址&#xff1a;https://arxiv.org/abs/1709.04875 Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 文章目录 一、摘要二、数据集介绍美国洛杉矶交通数据集 METR-LA 介绍美国加利福尼亚交通数据集 PEMS-BAY 介绍美国…