| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> iOS开发——Swift中的函数盘点 -> 正文阅读 |
|
[移动开发]iOS开发——Swift中的函数盘点 |
前言:
一、Swift函数定义 函数的定义包含函数名、函数体、参数及返回值,定义了函数会做什么、接收什么以及返回什么。函数名前要加上 func greet(person: String) -> String { let greeting = "Hello, " + person + "!" return greeting }
如果你正在面试,或者正准备跳槽,不妨看看我精心总结的面试资料:https://gitee.com/Mcci7/i-oser 来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障 二、函数返回值与参数 2.1 函数返回值从返回值的角度看,函数可以分为有返回值和无返回值两种。无返回值的函数可以有如下三种定义方式: func testA() -> Void { } func testB() -> () { } func testC() { } let a = testA() let b = testB() let c = testC() 打印 a、b、c 可以发现,三者的类型均为 [图片上传中…(image-1a4ab5-1637226038732-4)] 也就是说上面三种方式是等价的,都表示无返回值的情况,不过从代码简洁程度上来说,最后一种更方便使用。 还有一种函数有返回值的情况,如同第一节中所述的函数定义方式,即为一种返回值为 func testD() -> String { return "正常返回" } func testE() -> String { "隐式返回" }
func compute(a:Int, b: Int) -> (sum: Int, difference: Int) { return (a+b, a-b); } compute函数返回一个元组,包含了求和与求差,实现了返回多个值的情况。 2.2 函数参数与OC不同的是, [图片上传中…(image-9dbe10-1637226038734-20)] 2.2.1 函数标签
[图片上传中…(image-68984b-1637226038734-19)] 当使用 2.2.2 函数默认参数值
[图片上传中…(image-339f1f-1637226038734-17)] 由于参数 a 有了默认值 8,所以在调用时只传参 b 就可以。同样的,如果参数均有默认值,则在调用函数时,都可以不传值。 如图所示,由于两个参数均有默认值,在调用时都不传值,就像调用了一个无参函数一样。
[图片上传中…(image-3f5b28-1637226038734-15)] [图片上传中…(image-cd1ebe-1637226038734-14)] 下面一张图是 [图片上传中…(image-c7063e-1637226038734-13)] 在调用函数时,直接报错缺失第二个参数。因此,在 2.2.3 可变参数与OC的 [图片上传中…(image-25b3a8-1637226038734-12)]
可变参数需要注意的一点是,在紧随其后的一个参数不能省略参数标签,如下图所示: [图片上传中…(image-e7f40e-1637226038734-11)] 参数 可变参数本质上是一个数组,可以在函数内部使用参数,查看其类型如下: [图片上传中…(image-e5c4fd-1637226038732-3)] 可以看到 item 实际上是一个 Any 类型的数组。 2.2.4 inout修饰的参数在OC和C中,我们可以通过指针传参,以达到在函数内部修改函数外部实参的值的目的。在 [图片上传中…(image-f594cb-1637226038734-10)] number的值本来为10,经过inoutFunc函数调用,结果变为了 针对这两种说法,我们可以通过汇编来验证下,本次使用的是真机调试,因此使用的是ARM下的汇编。 将上图中 [图片上传中…(image-311e93-1637226038732-2)] 图中红框处为 inoutFunc 函数的调用处,在上面28行可以发现一行代码 这句代码的意思是,将[sp, #0x10]的值赋值给 x0 寄存器,[sp, #0x10]表示 单步调试进入 [图片上传中…(image-22c0cf-1637226038733-9)] 执行到第4行,再次读取 x0 寄存器得到了相同的值 [图片上传中…(image-497160-1637226038733-8)] 红框中的值 使用
三、函数重载 函数重载指的是函数名相同,但是参数名称不同 || 参数类型不同 || 参数个数不同 || 参数标签不同。需要注意的是,函数重载(overload)与函数重写(override)是两个概念,函数重写涉及到继承关系,而函数重载不涉及继承关系。另外,在OC中没有函数或方法的重载,只有重写。以下是几个函数重载的例子: [图片上传中…(image-8fa73d-1637226038733-7)] 可以看到,四个函数的方法名称相同,但是参数不同,实际上并不会报错,这就是方法重载。 不过方法重载也有需要注意的地方:
[图片上传中…(image-bc4706-1637226038733-6)] 如图所示,在调用方法时,编译器不知道该调用哪个函数,因此会报二义性错误。
[图片上传中…(image-ad1c00-1637226038733-5)] 从图中可以发现,由于第二个函数给参数c设置了默认值,在调用时形式上与第一个函数一样,不过编译器在此并不会报错,猜想是因为第二个函数还有一种 四、inline内联函数 内联函数,其实是指开启了编译器内联优化后,编译器会将某些函数优化处理,该优化会将函数体抽离出来直接调用,而不会给这个函数再开辟栈空间。 func test() { print("test123") } test() 如以上函数所示,调用 开启内联优化的方式如下图: [图片上传中…(image-2a6d5b-1637226038731-1)]
[图片上传中…(image-d8efac-1637226038731-0)] 全局搜索发现没有 不过内联优化,也不是对所有函数都会进行优化,以下几点不会优化:
内联函数还有内联参数控制
五、函数类型 每一个函数都可以符合一种函数类型,例如: func test() { print("test123") } 对应 () -> () func compute(a:Int = 8, b: Int = 9) -> Int { return a+b; } 对应 (Int, Int) -> Int 上述代码中, 函数类型也可以用作函数的参数和返回值,使用函数类型作为返回值的函数被称为高阶函数,例如: // 函数类型作为参数 func testFunc(action:(Int) -> Int) { var result = action(2) print(result) } func action(a:Int) -> Int { return a } testFunc(action: action(a:)) // 函数类型作为返回值 func action(a:Int) -> Int { return a } func testFunc() -> (Int) -> Int { return action(a:) } let fu = testFunc() print(fu(3)) 六、嵌套函数 Swift中,可以在函数内部定义函数,被称为嵌套函数,如下代码所示: func forward(_ forward: Bool) -> (Int) -> Int { func next(_ input: Int) -> Int { input + 1 } func previous(_ input: Int) -> Int { input - 1 } return forward ? next : previous } 像上面这样在函数内部定义其他的函数,其目的是为了将函数内部的实现封装起来,外部只看到调用了 forward,而不需要知道其内部的实现逻辑,当然也不能直接调用内部的嵌套函数。 总结 相对于OC,Swift中主要增加了以下几点:
整体而言,个人感觉Swift的函数使用起来更加方便,参数标签使得代码可读性更强。以上即为本篇关于Swift函数的总结,如有不足之处,欢迎大家指正。 作者 | 奔跑的不将就 来源 | 掘金 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:59:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |