10-Swift 函数

0、函数概念:

  • 函数相当于 OC 中的方法

  • 函数的格式:

func 函数名(参数列表) -> 返回值类型{
    代码块
    return 返回值
}
  • func 是定义函数的关键字
  • 如果有多个参数,参数列表之间用逗号 “,” 分割,也可以没有参数
  • 使用 “->” 指向返回值类型
  • 如果没有返回值,返回值类型为 Void,并且 “-> Void” 部分也可以省略,也可以改为 “-> ()”

例:

func test() -> Int{
    return 12;
}

let a = test()      //12

一、函数的基本使用

  • 参数、返回值的多种组合
  • 没有参数没有返回值
func test11() -> Void{
      print("没有参数没有返回值")
}
test11()    //"没有参数没有返回值"
  • 有参数没有返回值
func test12(str:String) {
      print("有参数:\(str),没有返回值")
}
test12(str: "wangyijiang")      //"有参数:wangyijiang,没有返回值"
  • 没有参数,有返回值
func test13() -> Int{
      return 13;
}
let a13 = test13()      //13
  • 有参数有返回值
func test14(a:Int,b:Int) -> Int{
      return a + b
}
let a14 = test14(a: 5, b: 4)    //9
  • 函数有多个返回值
func test15(a:Int,b:Int) -> (Int,Int){
    return (a+2,b+3)
}
let a15 = test15(a: 8, b: 7)
a15.0   //10
a15.1   //10

二、函数的内部参数、外部参数

  • 内参:在函数内部可以看到的参数;

  • 外参:在函数外部可以看到的参数;

  • 在3.0之后,默认情况下,函数参数既是内参也是外参;

  • 标签的使用:为了让函数调用者知道参数的意义。

func test21(name str1:String,addr str2:String) -> String{
    return "姓名是:\(str1),家庭住址为:\(str2)"
}
let info21 = test21(name: "王义江", addr: "北京海淀")  //"姓名是:王义江,家庭住址为:北京海淀"
  • 如果不想要外部参数,在前面加下划线 “__” 即可
func test22(name str1:String,_ str2:String) -> String{
    return "姓名是:\(str1),家庭住址为:\(str2)"
}
let info22 = test22(name: "yijiang", "北京海淀")    //"姓名是:yijiang,家庭住址为:北京海淀"

三、默认参数

  • 在某些情况下,如果没有传入具体的参数,可以使用默认参数:
func test31(第一个数 a:Int,第二个默认参数 b:Int = 8,第三个默认参数 c:Int = 6) -> Int{
    return a + b + c
}
  • 调用方式一:只传必选参数:
let a311 = test31(第一个数: 5)   //19
  • 调用方式二:传入所有参数:
let a312 = test31(第一个数: 7, 第二个默认参数: 3, 第三个默认参数: 2)      //12
  • 调用方式三:传入必须参数和任意一个默认参数组合:
let a313 = test31(第一个数: 2, 第二个默认参数: 7)      //15
let a314 = test31(第一个数: 3, 第三个默认参数: 5)      //16

四、可变参数

  • 当输入参数个数不确定时,可使用可变参数
func test41(a41:Int...) -> Int{
    var temp = 0
    for value in a41 {
        temp += value
    }
    return temp
}
test41(a41: 1,2,3)      //6
  • 注意点:所有参数的类型必须要一致,此例中都为 Int 类型

  • 可变参数在函数内部当作数组来处理;在函数外面,直接传递过来多个参数,每个参数都是独立的个体

  • 参数为数组时的比较:

func test42(a42:Array<String>) -> String{
    var temp:String = ""
    for value in a42 {
        temp += value
    }
    return temp
}
test42(a42: ["yijiang","wang"])     //yijiangwang
  • 传入的参数是一个数组,是一个整体

五、函数使用注意点:

  • 在函数内部,默认接受到的参数被赋值给一个常量,是不允许修改的;
  • 引用类型(指针的传递):关键字 inout。
func test51( a51:inout Int, a52:inout Int){
    let temp = a51
    a51 = a52
    a52 = temp
}
var b51 = 20
var b52 = 10

test51(a51: &b51, a52: &b52)
b51    //10
b52    //20
  • 函数的嵌套使用
    Swift 中,允许函数进行嵌套使用
func test52(){
    
    func test53(){
        print("第二层函数")
    }
    
    print("第一层函数")
    test53()
}
test52()
//第一层函数
//第二层函数

六、函数的类型

  • 概念:每个函数都有属于自己的类型,由参数类型和返回值类型组成
func testAdd61(a61:Double,b61:Double) -> Double{
    return a61 + b61
}
//函数的类型为:(Double, Double) -> Double
func testMultipul62(a62:Double,b62:Double) -> Double{
    return a62 * b62
}
//函数的类型为:(Double,Double) -> Double
  • 使用
  • 函数作为另外一个函数的参数
func test63(a63:Double,b63:Double,method:(Double,Double) -> Double){
      method(a63, b63)
}
test63(a63: 5, b63: 6, method: testAdd61)   //11
test63(a63: 5, b63: 6, method: testMultipul62)     //30
  • 函数作为另外一个函数的返回值
func test64(str:String) -> (Double,Double) -> Double{
      if str == "add" {
        return testAdd61
      }else{
        return testMultipul62
      }
}
test64(str: "add")(3,4)     //7
test64(str: "123")(3,4)     //12

此时,可以将返回值类型放在 () 中,更有层次感:

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

推荐阅读更多精彩内容