Swift return陷阱

news/2024/11/20 21:21:38/

return后还会执行后边的代码

我们来看下边一个例子:

func test() -> Bool {print("1 test")return falseprint("2 test")
}func test2() {print("1 test2")returnprint("2 test2")
}test()
test2()输出:
1 test
1 test2
2 test2

可以发现在test2()方法中,return 后的 print("2 test2")  语句竟被触发了。

这是因为Swift不需要分号,Swift编译器可以自动推断下一行是换行还是旧行的补全。 print() 是一个返回void的函数。 因此语句:return print()是有效的。

所以 test2方法等价于:

func test2() {print("1 test2")return print("2 test2")
}

如果return后有两条语句呢

func test2() {print("1 test2")return print("2 test2")print("3 test2")
}输出:
1 test2
2 test2

发现 print("3 test2") 语句也确实没有被执行,是因为 return print("2 test2") 语句代表这个方法已经结束了,后面的方法也就不会再执行。

其实这种情况下 Xcode是有系统警告的

print("2 test") Xcode报警告:
Expression following 'return' is treated as an argument of the 'return'print("3 test") Xcode报警告:
Code after 'return' will never be executed

怎么解决呢?

return语句不省略分号,给他添加上分号,告诉编译器语句已经结束了,就可以避免这个问题:

func test2() {print("1 test2")return;print("2 test2")print("3 test2")
}输出:
1 test2

总结:

I. 方法带返回值时,return 返回值 就是一个完整的语句,不会执行后续的方法。

II. 方法无返回值时,return后如果有语句,这条语句会被当作return的返回参数。

如果 return 后有两条语句,那么第一条会被当作return的返回语句执行,第二条语句就不会被执行,因为return语句 已经结束,方法体已经结束。


http://www.ppmy.cn/news/12499.html

相关文章

【数据结构】保姆级单链表教程(概念、分类与实现)

目录 🍊前言🍊: 🍈一、链表概述🍈: 1.链表的概念及结构: 2.链表存在的意义: 🍓二、链表的分类🍓: 🥝三、单链表的实现&#x1f…

寻找两个正序数组的中位数

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入…

Java使用Zxing二维码生成

目录 1、二维码简介 二维码纠错级别 2、ZXing简介 3、示例 3.1 搭建一个maven项目,引入Zxing依赖包 3.2 创建QrCodeUtil.java 类 1、二维码简介 二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录…

react受控组件和非受控组件区别

一、受控组件 在HTML中,表单元素的标签、、等的值改变通常是根据用户输入进行更新。 在React中,可变状态通常保存在组件的状态属性中,并且只能使用 setState() 进行更新,而呈现表单的React组件也控制着在后续用户输入时该表单中发…

Python学习笔记-PyQt6消息窗

对话框是界面编程中重要的窗体,一般用于提示或者一些其他特定操作。一、使用QDialog显示通用消息框直接使用QDialog类,可以及通过对话框进行通用对话框显示,亦可以通过自定义设置自己需要的对话框。# _*_ coding:utf-8 _*_import sysfrom PyQ…

Linux 中断子系统(八):中断处理流程

1、上层中断处理 系统初始化时,已经建立起 硬件中断号 和 软件中断号的 映射表。 中断注册时,我们需要先从设备树中获取硬件中断号,然后调用 API 将硬件中断号转换为软件中断号,根据软件终端号 irq 找到对应的 irq_desc,并将中断处理函数添加到 irq_desc 中(也就是 irq…

【C语言进阶】使用“动态内存文件处理”实现进阶版通讯录

目录 前言 改进后的优势 一、test.c 二、contact.h 三、contact.c 1.加载通讯录函数load_contact 2、将数据保存到文件save_contact函数 3、初始化通讯录init_contact函数 4、扩容check_full函数 5、销毁通讯录destory_contact函数 6、其余函数 四、完整源码 总结 …

java伪随机数生成器

关于随机数的基本概念 1、对随机数性质分类: 随机性:符合该性质的叫弱伪随机数。这种随机数仅可以用于一般应用,无法用在密码学,例如java中的java.util.Random类不可预测性:符合该性质的叫强伪随机数。在密码学中&am…