函数 Func

函数 Func1 函数函数是用来完成特定任务的独立代码块 函数的参数 参数可以提供默认值 用来简化函数调用 参数可以当做传入参数也可以当做传出参数 即传入的参数值可以被修改 所有参数放在圆括号内函数的返回值 与 OC 的语法不通 以 func 关键字为前缀 有返回值用 来表示用返回值 并添加返回值类型函数类型 函数类型包括参数值类型和返回值类型 每一个函数类型可以当做是普通的类型来处理 可以做函数的

1、函数

 函数是用来完成特定任务的独立代码块。 函数的参数:参数可以提供默认值,用来简化函数调用,参数可以当做传入参数也可以当做传出参数(即传入的参数值可以被修改),所有参数放在圆括号内 函数的返回值:与OC的语法不通,以func关键字为前缀,有返回值用“->”来表示用返回值,并添加返回值类型 函数类型:函数类型包括参数值类型和返回值类型,每一个函数类型可以当做是普通的类型来处理。可以做函数的参数和返回值使用 

2、函数参数名

a.局部参数

 func addInt(a:Int,b:Int) -> Int
 该函数给他们参数定义了参数名,但是这些参数名只能在函数内部调用使用,被成为局部参数名。 当调用该函数时 
 self.add(a: Int, b: Int)
 如图所示,你会发现第一个参数是局部参数名,第二个参数b不仅是局部参数,而且是外部参数名(即在调用函数的时候可以显示,表示该参数的的意义用途),那怎么给第一个参数添加外部参数名呢? 

b.外部参数

 外部参数名写在局部参数名之前,用空格分隔开 
 func addInt(anInt a:Int,anthoerInt b:Int) -> Int
 可是,发现,如果第一个参数和第二个参数都添加外部参数,在外部调用时候会显得更加清晰有表现力 

这里写图片描述
可以看出上面的默认外部参数名已经被现在添加的外部参数名取代。那为什么不添加外部参数名的情况下,b既可以是局部参数名也可以是外部参数名?

 简写外部参数名:当需要提供外部参数名,并且内部参数名已经定义好,并且不想再添加新的外部参数名,那在局部参数名之前加一个“#”,来表示局部外部参数名 

这里写图片描述

c.默认参数

 可以给每个参数定义一个默认值,调用该函数时,可以忽略该参数。在函数的定义时,给参数赋值,来表示默认参数 func addInt(#a: Int,b: Int = 1) -> Int 调用该函数时,有默认值的参数可以忽略不用。 
 self.addInt(a: 1)

d.可变参数

 一个函数可以接受一个或多个值,例如OC中的UIAlertView的最后一个参数,用"…"表示 

这里写图片描述

 func addAllNum(nums: Int...) ->Int { return nums.reduce(0, combine: +) }
 在函数内部,可以使用for循环来遍历数组。 注意:1.一个函数只能有一个可变参数 2.如果函数有多个参数,应将可变参数放在最后 3.可变参数的类型必须是一致的 

e.常量参数和变量参数

 一个函数的参数不加任何修饰关键字的一定为常量参数,是不可变的,如果有必要使用变量参数,使用var修饰 

f.输入输出参数

 如果想要一个函数可以修改参数的值,并且想要这些修改在函数调用结束后仍然存在,需要把这个参数定义为输入输出参数,使用关键字inout标记参数 注意:输入输出参数不能有默认值,有inout标记的参数不能使用var或let标记 

3、函数类型

 函数类型由函数的参数类型和返回值类型组成 例子: func addInt(#a: Int, anInt b: Int) -> Int,该函数的函数类型是 (Int, Int) -> Int 如果没有参数没有返回值,则函数的类型是 ( ) -> ( ) 

a.使用函数类型

 像普通类型一样使用函数类型 
 var addNum:(Int, Int) ->Int = addInt
 在声明addNum变量时将其指向addInt函数,因为addInt和addNum有相同的类型,Swift会自动对其内部参数返回值做匹配 
 let sum = addNum(1,2)

b.函数类型作为参数类型

 可以将(Int, Int) -> Int这样的类型作为函数的参数类型,这样可以将函数的一部分实现交给函数的这个参数来处理 
 func printIntNum(add: (Int, Int) -> Int, a: Int, b: Int) { println("num = \(add(a,b))") }
 第一个参数为函数类型,不要试着给这个函数类型加参数,例如: 
 func printIntNum(add: (aa: Int, bb: Int) -> Int, a: Int, b: Int)
 add只是一个参数,”:” 后面的是数据类型。 printIntNum函数不关心add函数是如何实现的,只关心传入的函数类型是正确的。 

c.函数类型作为返回值类型

 func chooseFunc(anInt: Int) -> ((Int) -> Int) { return anInt > 0 ? stepBackward : stepForward } func stepForward(anInt: Int) -> Int { return anInt + 1 } func stepBackward(anInt: Int) -> Int { return anInt - 1 } let a = chooseFunc(10)
 此时a是一个函数,对a继续处理 

d.嵌套函数

 嵌套函数是在一个函数内部定义一个函数,每一个内部函数都有一个自己的作用域,在大函数调用的时候是不会对嵌套函数做预加载处理,只有用到的时候才会调用。这个函数对外界是不可见的。对于上面的例子,可以这样写 
 func chooseFunc(anInt: Int) -> ((Int) -> Int) { func stepForward(anInt: Int) -> Int { return anInt + 1 } func stepBackward(anInt: Int) -> Int { return anInt - 1 } return anInt > 0 ? stepBackward : stepForward }

4、多个返回值

 func moreReturnValue() -> (Int, String) { return (404, "httpError") }

多个返回值,其实返回的是一个元组类型的数据,函数的返回值类型不需要在函数内部命名,因为在返回值类型中已经有了定义

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200078.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:34
下一篇 2026年3月20日 上午11:34


相关推荐

  • 【必收藏】2025 大模型行业落地全景图:从技术突破到各领域实战应用

    【必收藏】2025 大模型行业落地全景图:从技术突破到各领域实战应用

    2026年3月12日
    2
  • XGBoost算法梳理[通俗易懂]

    XGBoost算法梳理[通俗易懂]XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。讲解其原理前,先讲解一下CART回归树。一、CART回归树CART回归树是假设树为二叉树,通过不断将特征进行分裂。比如当前树结点是基于第j个特征值进…

    2022年6月3日
    45
  • JavaAPI之PropertyDescriptor[通俗易懂]

    JavaAPI之PropertyDescriptor[通俗易懂]随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)结构java.beans类PropertyDescriptorjava.lang.Objectjava.beans.FeatureDescriptorjava.beans….

    2022年10月1日
    4
  • java代码 软件_适合新手的java代码编写软件有哪些?

    java代码 软件_适合新手的java代码编写软件有哪些?适合新手的java代码编写软件有哪些?发布时间:2020-05-1816:39:11来源:亿速云阅读:196作者:Leah适合新手的java代码编写软件有哪些?相信很多人对java代码编写软件的了解处于一知半解状态,小编给大家总结了以下内容。如下资料是关于java代码编写软件的内容。1、eclipseEclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和…

    2026年2月24日
    4
  • c++ listnode 赋值_C++之ListNode[通俗易懂]

    单链表,弄清楚可stl中list的区别。ListNode的结构structListNode{intval;//当前结点的值ListNode*next;//指向下一个结点的指针ListNode(intx):val(x),next(NULL){}//初始化当前结点值为x,指针为空};如何向ListNode中插入新的结点:从键盘输入ListNode*temp1=new…

    2022年4月18日
    138
  • Jmeter下载安装配置—测试小白

    Jmeter下载安装配置—测试小白一,进入官网:http://jmeter.apache.org/1.第一步进入官网如下图2.选择进行下载,下载下来为一个压缩包,解压即可。3.我下载的是jmeter4.0版本,对应jdk1.8。然后就进行解压。个人认为要注意3点:1.解压之后压缩包叫apache-jmeter-4.0.zip,如是src.zip后缀的都不对,打开之后会报错不可用,因为里面缺少我们下一步将要配置的环境变量.jar文件…

    2022年5月29日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号