为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

为什么会有函数调用参数带标签的写法?

ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如:
[person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意,要把标签和函数签名区分开,函数签名是更大的名词,包含函数名称、参数的组合。当然,也可以对第二个之后的参数不加前缀,形如: [person setAge: 29 :1 : 35];

如果是C++代码,参数很多,有时会记不清参数位置。
C#较新版本同样引入了如上的类似ObjC的函数调用语法增强可读性。

Swift函数调用的参数传递需要加前缀是否是冗余?

事实上,很少有编程语言函数调用传参需要加参数前缀,ObjC和Swift遵循的规则是函数参数易读原则,当一个函数有超过3个参数甚至更多,程序员可能不能直观理解每个参数的意义,甚至参数位置用错,加上前缀的调用方法反而更清晰可靠。

函数调用

函数调用的语法

大部分编程语言,在函数名后面加上括号(以及参数)作为函数调用。

  • C/ObjC/C++/Java/C#/Python 等均是如此。

不带括号的函数名

  • C/ObjC/C++ 语言单独的函数名并不会调用函数,例如 func; 只会计算函数地址,然后结束,没有调用。
  • Python 类似,不带括号的函数名不会执行函数。

函数参数

和普通变量声明类似,函数参数类似于多个普通变量声明。

参数形式

  • 大部分编程语言的函数参数放在函数名紧随的圆括号里,不同参数用逗号分隔。
    C/ObjC/C++/Java/C#/Kotlin/Python 等均是此。

参数列表和逗号表达式

函数参数列表虽然以逗号分隔,但不是逗号表达式。即,函数参数里面的逗号一定不是逗号运算符,而是函数参数分隔。如果一定需要在函数参数用逗号表达式,用括号括起来。

声明和调用类型不一致

  • C语言函数有声明和定义两种形态,在某些情况,可能出现函数声明晚于函数调用,编译器没法知道真实的参数类型,会执行默认的类型转换。
    • 例如先调用func(1.2),再定义void func(float f),编译器会认为调用时传入的是double类型变量1.2,但实际执行参数是float,结果不如预期。
  • Java/C#/Python不存在这种情况,编译器或解释器提前会获取类型信息而不是延迟到调用时。

一些独特的函数参数形式

  • 经典C语言将函数参数单独声明,类似 int f(a, b) float a, b; … 这种写法已被摒弃。
  • ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如:
    [person setAge: 29 setSex:1 setClass: 35]; 如果是C++代码,参数很多,有时会记不清参数位置。
    当然,也可以对第二个之后的参数不加前缀,形如: [person setAge: 29 :1 : 35];
  • C#新版本同样引入了类似ObjC的语法增强可读性。
  • Kotlin 支持具名参数,支持形如:形参1 = 实参1 这种形式。
    show(name = "Alex", age = 29);
  • Python 提供的方式和Kotlin类似,被称为关键字实参,例如:
    函数原型:def show(name, age)
    调用方式:show(age = 29, name = "Alex");

形参和实参

  • 形式参数和实际参数不必要同名,C语言可以从汇编代码看到,名字其实是地址或寄存器的代名词,和代码中的名字无任何关系。
  • Parameter和Argument都是参数,在很多场景二者没区别。Wiki的说法是parameter表示形参,argument表示实参,这有点学院派了,仁者见仁智者见智。

隐式类型转换

  • 实参类型可以隐式转换成形参,编译器才不会报错。

参数默认值

  • C/ObjC 不支持默认参数。
  • C++/Java/C#/Python/PHP 等均支持函数参数默认值,一般而言,默认值参数必须放在最后。
  • Kotlin 默认参数不一定放在最后,它通过具名参数显式指定参数。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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

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

相关文章

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一: 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

高德地图python地理编码和geopandas应用判断坐标点空间位置

在本人另一篇文章(高德地图地理编码python(版本3.9)爬虫(含坐标转换及数据表模板)-CSDN博客)的基础上增加geopandas功能,使脚本能自动根据查找的高德地图坐标与现有的几何范围进行交互&#xff…

Pygame介绍与游戏开发

提供pygame功能介绍的文档:Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同,pygame提供了图形化使用界面GUI(graphical user interface)基于图像的界面可以创建一个有图像和颜色的窗口 要让py…

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个 Python 文件,在给文件命名时建议使用英文字母和下划线的组合,创建好的 Python 文件会自动打开&#…

02.06 网络编程_套接字

思维导图: 网络编程基础:套接字的使用 网络编程是现代软件开发中不可或缺的一部分,而套接字(Socket)是网络编程中用于实现不同主机间通信的基本工具。本文将详细介绍套接字的概念、创建方法、如何通过套接字发送和接…

< OS 有关 > Ubuntu 版本升级 实践 24.04 -> 24.10, 安装 .NET

原因: 想安装 .NET 9 去编译 GitHut 项目,这回用不熟悉的 Ubuntu来做,不知道怎么拐去给 Ubuntu 升级,看到现在版本是 24.10 但不是 LTS 版本,记录下升级过程。 一、实践过程: 1. 查看当前版本 命令1: l…

VsCode创建VUE项目

1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …

分布式微服务系统架构第91集:系统性能指标总结

加群联系作者vx&#xff1a;xiaoda0423 仓库地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ 系统性能指标总结 系统性能指标包括哪些&#xff1f; 业务指标、资源指标、中间件指标、数据库指标、前端指标、稳定性指标、批量处理指标、可扩展性指标、可靠性指标。 …

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现&#xff08;概念性&#xff09; 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…

CSS Overflow 属性详解:控制内容溢出的利器

在前端开发中&#xff0c;处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性&#xff0c;帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性&#xff1f; overflow 属性用于控制当元素的内容…

go语言中的接口

接口简介 现实生活中的接口 现实生活中手机、相机、U 盘都可以和电脑的 USB 接口建立连接。我们不需要关注 usb 卡槽大小是否一样&#xff0c;因为所有的 USB 接口都是按照统一的标准来设计的。 Golang 中的接口&#xff08;interface&#xff09; Golang 中的接口是一种抽象…

网络安全威胁框架与入侵分析模型概述

引言 “网络安全攻防的本质是人与人之间的对抗&#xff0c;每一次入侵背后都有一个实体&#xff08;个人或组织&#xff09;”。这一经典观点概括了网络攻防的深层本质。无论是APT&#xff08;高级持续性威胁&#xff09;攻击、零日漏洞利用&#xff0c;还是简单的钓鱼攻击&am…

Redis企业开发实战(三)——点评项目之优惠券秒杀

目录 一、全局唯一ID (一)概述 (二)全局ID生成器 (三)全局唯一ID生成策略 1. UUID (Universally Unique Identifier) 2. 雪花算法&#xff08;Snowflake&#xff09; 3. 数据库自增 4. Redis INCR/INCRBY 5.总结 (四)Redis实现全局唯一ID 1.工具类 2.测试类 3…

Verilog代码实例

Verilog语言学习&#xff01; 文章目录 目录 文章目录 前言 一、基本逻辑门代码设计和仿真 1.1 反相器 1.2 与非门 1.3 四位与非门 二、组合逻辑代码设计和仿真 2.1 二选一逻辑 2.2 case语句实现多路选择逻辑 2.3 补码转换 2.4 7段数码管译码器 三、时序逻辑代码设计和仿真 3.1…

排序算法--基数排序

核心思想是按位排序&#xff08;低位到高位&#xff09;。适用于定长的整数或字符串&#xff0c;如例如&#xff1a;手机号、身份证号排序。按数据的每一位从低位到高位&#xff08;或相反&#xff09;依次排序&#xff0c;每次排序使用稳定的算法&#xff08;如计数排序&#…

图形化界面MySQL(MySQL)(超级详细)

目录 1.官网地址 1.1在Linux直接点击NO thanks…? 1.2任何远端登录&#xff0c;再把jj数据库给授权 1.3建立新用户 优点和好处 示例代码&#xff08;MySQL Workbench&#xff09; 示例代码&#xff08;phpMyAdmin&#xff09; 总结 图形化界面 MySQL 工具大全及其功能…

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…