当前位置: 首页 > article >正文

为什么会有函数调用参数带标签的写法?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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关文章:

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

为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如: [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…...

如可安装部署haproxy+keeyalived高可用集群

第一步,环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip:192..168.244.101 Vip:192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...

如何运行Composer安装PHP包 安装JWT库

1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...

安全策略配置

1.拓扑信息 2. 实验需求 3.需求分析 1.需要在交换机LSW1配置分配vlan并且为配置通道 2/3/4/5 在web界面或者命令行制定相应的安全策略 由于存在默认的拒绝需求4中生产区在任何时刻访问不了web不允许单独配置,只配置动作为运行的策略 4.配置信息 先配置服务器 …...

使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1

Chainlit是一个开源的 Python 包,用于构建可用于生产的对话式人工智能。 DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进…...

Cursor 与多语言开发:全栈开发的利器

引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测,到2025年全球 AI 安全解决方案市场规模将突破200亿美元,年复合增长率超过30%,而Gartn…...

家政预约小程序12服务详情

目录 1 修改数据源2 创建页面3 搭建轮播图4 搭建基本信息5 显示服务规格6 搭建服务描述7 设置过滤条件总结 我们已经在首页、分类页面显示了服务的列表信息,当点击服务的内容时候需要显示服务的详情信息,本篇介绍一下详情页功能的搭建。 1 修改数据源 在…...

知识蒸馏教程 Knowledge Distillation Tutorial

来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.29 NumPy+Scikit-learn(sklearn):机器学习基石揭秘

2.29 NumPyScikit-learn:机器学习基石揭秘 目录 #mermaid-svg-46l4lBcsNWrqVkRd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46l4lBcsNWrqVkRd .error-icon{fill:#552222;}#mermaid-svg-46l4lBcsNWr…...

DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索

DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索 在人工智能领域,大型语言模型(LLMs)的发展日新月异,其在自然语言处理和生成任务中的表现逐渐接近人类水平。然而,如何进一步提升这些模型的推理能…...

【C语言】指针详解:概念、类型与解引用

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯指针的基本概念1. 什么是指针2. 指针的基本操作 💯指针的类型1. 指针的大小2. 指针类型与所指向的数据类型3. 指针类型与数据访问的关系4. 指针类型的实际意…...

【怎么用系列】短视频戒断——对推荐算法进行干扰

如今推荐算法已经渗透到人们生活的方方面面,尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨,慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...

【OS】AUTOSAR架构下的Interrupt详解(上篇)

目录 前言 正文 1.中断概念分析 1.1 中断处理API 1.2 中断级别 1.3 中断向量表 1.4 二类中断的嵌套 1.4.1概述 1.4.2激活 1.5一类中断 1.5.1一类中断的实现 1.5.2一类中断的嵌套 1.5.3在StartOS之前的1类ISR 1.5.4使用1类中断时的注意事项 1.6中断源的初始化 1.…...

UE编辑器工具

如何自己制作UE小工具提高工作效率 在虚幻编辑器用户界面中,可以使用各种各样的可视化工具来设置项目,设计和构建关卡,创建游戏性交互等等。但有些时候,当你确定了需要编辑器执行的操作后,可能想要通过编程方式调用它…...

【Linux】25.进程信号(2)

文章目录 4.捕捉信号4.1 重谈地址空间4.2 内核如何实现信号的捕捉4.3 sigaction4.4 可重入函数4.5 volatile4.6 SIGCHLD信号(了解) 4.捕捉信号 4.1 重谈地址空间 用户页表有几份? 有几个进程,就有几份用户级页表–进程具有独立性…...

洛谷 P1387 最大正方形 C语言

题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。 输入格式 输入文件第一行为两个整数 n, m (1 ≤ n, m ≤ 100),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1。 输出格式 …...

使用React和Material-UI构建TODO应用的前端UI

使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…...

2502,索界面3

原文 SonicUI,你从未见过的方便GUI引擎-源码 介绍 SonicUI是基于原生GDIAPI的GUI引擎.它提供了几个简单的UI组件来实现高效的UI效果,如自绘按钮,不规则窗口,动画,窗口中的网径和图像操作方法. 主要目的是用最少的代码来达到最佳效果. 背景 周知,UI开发一般重复用无趣.因此…...

ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识

ChatGPT除了可以协助办公,写作文案和生成短视频脚本外,和还可以做为一个法律工具,当用户面临一些法律知识盲点时,可以向ChatGPT咨询获得解答。赋予ChatGPT专家的身份,用户能够得到较为满意的解答。 1.咨询法律知识 举…...

[吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版

CursorWorkshop V6.33 专业鼠标光标制作工具 链接:https://pan.xunlei.com/s/VOIFeq5DFB9FS56Al_mT2EfdA1?pwd7ij4# 产品概述 Axialis CursorWorkshop 是一个专业光标创作工具它在 Windows 下运行,让您轻松创建高质量的静态和动态光标适用于 Windows …...

《运维:技术的基石,服务的保障》

1. LVS(Linux Virtual Server):基于Linux内核的四层负载均衡解决方案 2. Bonding(链路聚合):物理网卡冗余与带宽叠加技术 3. RHEL(Red Hat Enterprise Linux):企业级Li…...

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…...

Day25 洛谷 提高- 1007

零基础洛谷刷题记录 Day01 2024.11.18 Day02 2024.11.25 Day03 2024.11.26 Day04 2024.11.28 Day05 2024.11.29 Day06 2024 12.02 Day07 2024.12.03 Day08 2024 12 05 Day09 2024.12.07 Day10 2024.12.09 Day11 2024.12.10 Day12 2024.12.12 Day13 2024.12.16 Day14 2024.12.1…...

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备,其运行状态直接关系到生产安全与经济效益。据统计,涡轮故障导致的非计划停机可造成每小时数十万元的经济损失,且突发故障可能引发严重安全事故。传统人…...

GGML、GGUF、GPTQ 都是啥?

GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...

Kafka 使用说明(kafka官方文档中文)

文章来源:kafka -- 南京筱麦软件有限公司 第 1 步:获取 KAFKA 下载最新的 Kafka 版本并提取它: $ tar -xzf kafka_{{scalaVersion}}-{{fullDotVersion}}.tgz $ cd kafka_{{scalaVersion}}-{{fullDotVersion}} 第 2 步:启动 KAFKA 环境 注意:您的本地环境必须安装 Java 8+。…...

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关…...

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接:https://arxiv.org/abs/2402.06196 摘要:自2022年11月ChatGPT发布以来,大语言模型(LLMs)因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样,大语言模型通过在大量文本数…...

物理群晖SA6400核显直通win10虚拟机(VMM)

写在前面:请先确保你的核显驱动支持开启SR-IOV 确保你的BIOS开启了以下选项: VT-D VMX IOMMU Above 4G ResizeBAR 自行通过以下命令确认支持情况: dmesg | grep -i iommudmesg | grep DMAR分配1个虚拟vGPU:echo 1 | sudo tee /sy…...