Swift-func

image.png

简易函数

func transfer(value : Double) -> Double {
    return value + Double(1)
}
print(transfer(value: 10))
  • 形参默认是let,也只能是let
  • 无返回值 ->Void ->() 或者没有->也可以

隐式返回

无需return

func sum(v1: Int, v2: Int) -> Int {
    v1 + v2
}
print(sum(v1: 10, v2: 10))
  • 如果整个函数体是一个单一表达式,那么函数会隐式返回这个表达式

元组返回

实现多返回值

func calculate(v1: Int,v2: Int) -> (sum:Int,difference:Int,average:Int) {
    let sum = v2 + v1
    return (sum,v1 - v2, v1 * v2)
}
let result = calculate(v1: 10, v2: 20).sum
print(result)

函数注释

image.png

参数标签(Argument Label)

func goToWork(time:String) -> Void {
    print("this time is \(time)")
}
goToWork(time: "2020年11月17日 13:31:29")
func goToWork1(at time:String) -> Void {
    print("this time is \(time)")
}
goToWork1(at: "2020年11月17日 13:31:29")
func goToWork2(_ time:String) -> Void {
    print("this time is \(time)")
}
goToWork2("2020年11月17日 13:31:29")
image.png
  • _省略参数标签

默认参数值 Default Parameter Value

image.png
func check(name:String = "noBody",age:Int,job:String = "none") -> Void {
    print("name=\(name),age=\(age),job=\(job)")
}
check(age: 10)
check(name: "wpp", age: 27, job: "iOS")
check(name:"mosi",age: 20)
image.png
  • 省略标签注意别出错

可变参数

func sum(numbers: Int...) -> Int {
    var total = 0
    for i in numbers {
        total = i + total
    }
    return total
}
print(sum(numbers: 1,2,3,4,5))
  • 一个函数最多只能有一个可变参数
  • 紧跟着可变参数后面 后面的参数不能省略参数_哦!

输入输出参数 In Out Parameter

可以用inout 定义一个输入输出参数:可以在函数内部修改外部实参的值

func swapValues(v1:inout Int,v2:inout Int) {
    let tmp = v1
    v1 = v2
    v2 = tmp
    
}
var v1 = 10,v2 = 20
print("v1 = \(v1),v2 = \(v2)")
swapValues(v1: &v1, v2: &v2)
print("v1 = \(v1),v2 = \(v2)")
  • inout 参数本质是地址传递(引用传递)
  • inout 不能有默认值
  • 可变参数不能标记inout
  • inout只能传入

函数重载 (Function Overload)

  • 函数名相同
  • 参数个数不同/参数类型不同/参数标签不同
  • 返回值类型和重载无关
func total(v1: Int ,v2: Int,v3: Int = 10) -> Int {
    v1 + v2 + v3
}
print(total(v1: 10, v2: 10))
print(total(v1: 10, v2: 10, v3: 10))

控制体打印:
30
30


func total(v1: Int ,v2: Int) -> Int {
    v1 + v2
}
func total(v1: Int ,v2: Int,v3: Int = 10) -> Int {
    v1 + v2 + v3
}
print(total(v1: 10, v2: 10))
print(total(v1: 10, v2: 10, v3: 10))
控制体打印:
20
30
  • 默认参数和函数重载一起使用会产生二义性编译器不会报错(C++会报错)
  • 可变参数、省略参数、函数重载一起产生二义性编译器可能会报错

内联函数 Inline Function

无需关注

print("内联函数 Inline Function")
//* 如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数
//* 将函数调用展开成函数体
//* 永远不会被内联(即使开启了编译器优化)
@inline(never) func test() {
    print("test")
}
//* 开启编译器优化后,即使嗲吗很长,也会被内联(递归调用函数、动态派发的函数除外)
@inline(__always) func test1() {
    print("test1")
}
test()
//* 在Release模式下,编译器已经开启优化,会自动决定哪些喊出需要内联,因此没必要使用@inline

函数类型

  • 每一个函数都是有类型的,函数类型由形式参数类型返回值型组成
func task() {
    
}
//() - > Void      () -> ()
func task(a: Int,b: Int) -> Int {
    a + b
}
//(Int,Int) -> Int
print(task(a: 10, b: 20))
//调用时不需要参数标签
var fnnnnn:(Int,Int) -> Int = task
print(fnnnnn(10,20))

函数作为参数、返回值

  • 作为参数
func pp(v1: Int,v2: Int) -> Int {
    v1 + v2
}
func pp1(v1: Int,v2: Int) -> Int {
    v1 - v2
}
func pp2(fn:(Int,Int) -> Int,a: Int,b: Int) {
    print("result:\(fn(a,b))")
}
func pp2(_ fn:(Int,Int) -> Int,_ a: Int,_ b: Int) {
    print("result:\(fn(a,b))")
}
pp2(fn: pp, a: 20, b: 30)
pp2(fn: pp1, a: 50, b: 30)
pp2(pp, 20, 30)
  • 返回值
func pp3() -> (Int,Int) -> Int {
    pp
}
print(pp3()(20,30))

嵌套函数

和函数作为返回值差不多意思

func pp4(_ forward:Bool) -> (Int) -> Int {
    func next(_ input: Int) -> Int {
        input + 1
    }
    func previous(_ input: Int) -> Int {
        input - 1
    }
    return forward ? next : previous
}
print(pp4(true)(2))

配合typealias

typealias byte = Int8
let a:byte = 8
print(a)

typealias IntFn = (Int ,Int) -> Int
func difference(v1: Int, v2: Int) -> Int {
    v1 - v2
}
let fn:IntFn = difference

func setFn(_ fn:IntFn) -> Void {
    
}
func getFn() -> IntFn {
    difference
}
print(fn(20,10))

补充 (Function)

函数作为参数函数类型的时候 绑定函数

func sum(v1: Int ,v2: Int) -> Int {
    v1 + v2
}
var fn:(Int,Int)->Int = sum

下面打印sum

print(sum)

(Function)

如果函数是重载函数则不行


image.png

Ambiguous use of 'sum':“sum”用法不明确

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

推荐阅读更多精彩内容