Swift 函数的理解

Swift.png
函数的简单说明
  • 函数是一段完成特定任务的独立代码片段。
  • 在定义一个函数时,有多个或者一个数据类型的值,作为函数的输入,成为参数
  • 在一定某个类型的值作为返回值的时候,成为返回类型
  • func作为前缀,指定函数的返回类型时,用返回箭头-> 后跟返回类型的名称的方式表示
//表示如下:
func 函数名(参数1:参数类型,参数2:参数类型,参数3:参数类型...) -> 返回值类型 {
    代码块
    return 返回值
}

注意: 函数的参数默认是 let类型,不可以修改的,如果想要修改,必须使用inout关键字 就是后面说的 引用类型指针传递

函数参数与返回值
  • 无参数无返回值的函数
func hanshu() -> Void {
    
    print("没有参数,没有返回值");
}

hanshu();
//打印结果: 没有参数,没有返回值

//简写的 没有返回值的话  直接简写

func hanshu(){
    
    print("没有参数,没有返回值");
}

hanshu();

//注意:严格上来说,虽然没有返回值被定义,hanshu() 函数依然返回了值。没有定义返回类型的函数会返回一 个特殊的 Void 值。它其实是一个空的元组(tuple),没有任何元素,可以写成()。


  • 无参数有返回值的函数
func sayHello() ->String {
    
    return "hello 你好";
}

let hello = sayHello();
print(hello);
//打印结果: hello 你好

  • 有参数 没有返回值
//name:参数名 String:参数类型
func personName(name:String) {
    
    print("我是\(name),哈哈");
}

personName(name: "CC");

//打印结果:我是CC,哈哈
  • 有参数 有返回值,多个参数用 , 分开
func sum(num1:Int,num2:Int,num3:Int) -> Int {
    
    return  num1+num2 + num3;
}

let numSum = sum(num1: 10, num2: 20, num3: 30);
print(numSum);

//打印结果:60

  • 返回一组数据的函数 多重返回值函数
//元祖 是保存一组数据的,这个函数 返回值是一个  元祖
func tulpNum(PersonName:String,PersonAge:Int,PersonSex:String) -> (name:String,age:Int,sex:String){
    
    
    return (PersonName,PersonAge,PersonSex);
}


let tulp =  tulpNum(PersonName: "CC", PersonAge: 20, PersonSex: "男");
tulp.name;
//打印是 “CC

//参数是数组 返回是元祖
 func minMax(array: [Int]) -> (min: Int, max: Int) {
     var currentMin = array[0]
     var currentMax = array[0]
     for value in array[1..<array.count] {
         if value < currentMin {
             currentMin = value
         } else if value > currentMax {
             currentMax = value
} }
     return (currentMin, currentMax)
 }


let arrayTulp = minMax(array: [1,2,3,10,5,9]);

print(arrayTulp.min);
print(arrayTulp.max);
//打印结果是 : min是:1
              max是:10 

函数参数标签参数名称
  • 指定参数标签
    • 可以在函数名称前指定它的参数标签,中间以空格分隔
func someFunction(argumentLabel  parameterName: Int) { 
// 在函数体内,   parameterName 代表参数值
}

//  from 参数标签
func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// 打印 "Hello Bill! Glad you could visit from Cupertino."




  • 忽略参数标签
    • 不希望为某个参数添加一个标签,可以使用一个下划线( _ )来代替一个明确的参数标签。
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// 在函数体内,firstParameterName 和 secondParameterName 代表参数中的第一个和第二个参数值
}
someFunction(1, secondParameterName: 2)
  • 默认参数
    • 某些情况,如果没有传入具体的参数,可以使用默认参数
func makecoffee(type :String = "卡布奇诺") -> String {
    return "制作一杯\(type)咖啡。"
}

let coffee1 = makecoffee("拿铁")
// "制作一杯拿铁咖啡。"
let coffee2 = makecoffee()
// 打印:"制作一杯卡布奇诺咖啡。
  • 可变参数
    • swift中函数的参数个数可以变化,它可以接受不确定数量的输入类型参数
    • 它们必须具有相同的类型
    • 我们可以通过在参数类型名后面加入(...)的方式来指示这是可变参数

注意:一个函数,最多只能有一个可变参数,紧跟在可变参数后面的参数不能省略参数标签

func sum(numbers:Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total
}

sum(100.0, 20, 30)
sum(30, 80)
//注意: 一个函数最多只能拥有一个可变参数。
  • 引用类型(指针的传递)
    • 默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址
    • 必须是变量,因为需要在内部改变其值
    • Swift提供的inout关键字就可以实现
 // 函数一:值传递
  func swap(var a : Int, var b : Int) {
    let temp = a;
    a = b;
    b = temp
   print("a:\(a), b:\(b)")
  }
   var a = 10
  var b = 20
  swap(a, b: b)
  print("a:\(a), b:\(b)")


  // 函数二:指针的传递
  func swap1(a:inout  Int, inout b : Int) {
  let temp = a
    a = b
    b = temp
    print("a:\(a), b:\(b)")
}

  swap1(&a, b: &b)
  print("a:\(a), b:\(b)")


函数的类型
// 函数类型 (Int, Int, Int) -> Int

//函数类型: 参数类型 和返回值类型 组成
func sum(num1:Int,num2:Int,num3:Int) -> Int {

    return  num1+num2 + num3;
}


//函数类型作为参数
func exen(n1:Int,n2:Int,n3:Int,fun:(Int,Int,Int) -> Int) -> Void{
    
    let result = fun(n1,n2,n3);
    print(result);
    
}

exen(n1: 10, n2: 10, n3:30,fun: sum);


//函数类型作为返回值


func getFunc() -> (Int,Int,Int) -> Int{
    return sum;
}
let value1 = getFunc();
value1(20,30,20);

//打印: 70

//函数类型 作为 类的属性




//编辑器根据
 1.函数的名称分别函数
 2.根据外部参数名称 分别函数
3.根据 参数类型 + 返回值类型 = 函数类型 来区别


函数重载

  • 函数名相同
  • 参数个数不同 || 参数不同 || 参数标签不同
//函数名相同  参数标签不同
func f1(v1:Int,v2:Int){
    print(v1 + v2);
}

func f1(v3:Int,v4:Int){
    print(v3 + v4);
}

内联函数

  • 内联函数: 在函数调用的时候, 把其展开成函数体,直接执行
  • 以下函数是不会内联的
    • 函数体过长
    • 包含递归函数
    • 包含动态派发

在Swift中的项目中,如果在打包函数或者调试中使用Release模式,

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 函数是用来完成特定任务的独立的代码块。给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这...
    穷人家的孩纸阅读 810评论 2 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 定义和调用函数 在下面的例子中的函数叫做greet(person :),因为这是它的作用 - 它需要一个人的名字作...
    Joker_King阅读 276评论 0 1
  • 函数是用来完成特定任务的独立的代码块。可以给函数起一个名字,用于标识一个函数,当函数需要执行的时候,这个名字就会用...
    EndEvent阅读 743评论 1 3
  • 图文|王學藝 五、四、三……绿灯提示行将开始! 我蓦然从沉思中下意识拿出手机,打开打开拍照,定格这生活瞬间被触动的...
    王学艺阅读 926评论 14 17