Swift 中函数使用指南
关于Swift中的各种函数的使用的总结
前言
时间久了,好多东西我们就会慢慢忘记,在这里总结一下Swift中函数的使用原则,把大部分的函数使用技巧用代码示例来做了演示,但是如果想提高,还是要多多思考才行
1.参数名
函数默认会带参数名,如果不想显示参数名,可以使用下划线_。
func createFamily(motherName: String, fatherName: String, babyName: String) -> String {
return motherName + fatherName + babyName
}
createFamily(motherName: "妈妈", fatherName: "爸爸", babyName: "bao'b")
2.多参数函数
多参数函数的使用,整个函数都是可以自定义的,实现非常灵活。(也叫可变参数)
func sum(numbers: Int...) -> Int {
var total: Int = 0
for number in numbers {
total += number
}
return total
}
sum(numbers: 1, 2, 3, 4, 5, 6)
3.可变参数
注意,在最新的swift中,已经不允许在参数中使用var了,可以使用下边的这个值传递的方式实现
func factorial(number: Int) -> Int {
var number = number
var res: Int = 1
while number > 1 {
res = res * number
number = number - 1
}
return res
}
var number: Int = 4
let b = factorial(number: number)
通过a: inout 这种方式可以在函数内修改参数的值,但是在使用中还是要加入&,目的是访问参数的指针地址
func swap(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
var a = 10
var c = 20
swap(&a, &c)
print("a: \(a), b: \(c)")
4.函数的高级用法
1.函数本身也是一种类型
func sayHello() -> Void { // 该函数的类型为() -> ()
}
// 该函数的类型为(Dictionary<String, String>) -> (Int, Int)
func count(kids: Dictionary<String, String>) ->
(girls: Int, boys: Int) {
return (1, 2)
}
2.函数作为变量,这也验证了函数类型和函数作为值来进行赋值
var countFunc: (Dictionary<String, String>) -> (Int, Int) = count
let kids: Dictionary<String, String> = ["123" : "456"]
print(countFunc(kids))
3.函数类型作为返回值
// 这个示例是这样的,我们根据用户的输入("吃""喝")来选择不同的函数进行打印
typealias NoParameterFunc = (() -> ()) // 可以为一个类型起一个别名
func eat() -> Void {
print("吃了一块饼干")
}
func drink() -> Void {
print("喝了一杯水")
}
func doSomethingWithIdentifier(identifier: String) -> (NoParameterFunc)? {
switch identifier {
case "吃":
return eat //因为我们返回的是一个函数类型,所以使用eat,要是使用eat()就返回一个函数了
case "喝":
return drink
default:
return nil
}
}
let doSomething = doSomethingWithIdentifier(identifier: "吃")
if let doSomething = doSomething {
doSomething() //调用函数
}
4.嵌套函数
// 函数内部依然可以有函数,我们队上边的例子进行改造,结果一样
func anotherDoSomethingWithIdentifier(identifier: String) -> (NoParameterFunc)? {
func eat1() -> Void {
print("吃了一块饼干")
}
func drink1() -> Void {
print("喝了一杯水")
}
switch identifier {
case "吃":
return eat1 //因为我们返回的是一个函数类型,所以使用eat,要是使用eat()就返回一个函数了
case "喝":
return drink1
default:
return nil
}
}
5.柯里化函数
在swift3.0中已经被移除,原因是使用场景不多,且使语言变得复杂,大家了解下就好了
func add(a: Int, b: Int, c: Int) -> Int {
return a + b + c
}
let d = add(a: 1, b: 2, c: 3)
// swift3.0中支持的柯里化
func addCur(a: Int) -> (_ b: Int) -> (_ c: Int) -> Int {
return {
(_ b: Int) -> (_ c: Int) -> Int in
return {
(_ c: Int) -> Int in
return a + b + c
}
}
}
6.闭包
func compare(l1: Int, l2: Int) -> Bool {
return l1 > l2
}
let numbers = [2, 3, 6, 8, 1]
let sortedNumbers = numbers.sorted(by: { (l1: Int, l2: Int) -> Bool in return l1 > l2})
print(sortedNumbers)
let sortedNumbers1 = numbers.sorted(by: { (l1, l2) in l1 > l2})
print(sortedNumbers1)
let sortedNumbers2 = numbers.sorted(by: { $0 > $1})
print(sortedNumbers2)
let sortedNumbers3 = numbers.sorted(by: >)
print(sortedNumbers3)
// 尾闭包函数
// 当函数中的参数中使用了闭包,而且闭包内部很复杂,且闭包是最后一个参数时,才能使用尾闭包
let sortedNumbers4 = numbers.sorted() { // 同样是上边的例子,我们可以使用尾闭包,好处是增加代码的阅读性
$0 < $1
}
print(sortedNumbers4)
总结
基本上掌握了这些函数的使用,在开发中也就够用了,要进阶,可以多了解函数响应式编程。
Swift 中函数使用指南的更多相关文章
- SWIFT中函数返回值为Tuple
在playgroundm内键入以下代码,求一个成绩数组内最大分值和最小分值 func maxminScore(scores:Array<Int>) -> (maxScore:Int, ...
- Swift新手教程系列5-函数+selector在swift中的使用方法
原创blog.转载请注明出处 近期在用swift写代码,尽管遇到一些问题,可是代码量确实减了不少. swfit新手教程系列会随着我使用swfit中的积累,不断地去修正更新 之前的教程 swift单例模 ...
- Swift 中的函数(下)
学习来自<极客学院:Swift中的函数> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation /******** ...
- Swift 中的函数
学习来自<极客学院:Swift中的函数> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 练习一: import Foundation //函数 ...
- Swift 中的利刃,函数和闭包
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)
很久之前用过一次,后来就忘了...扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript.python.DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的 ...
- Swift 中的高阶函数和函数嵌套
高阶函数 在Swift中,函数可做为“一等公民”的存在,也就意味着,我们可以和使用 int 以及 String 一样,将函数当做 参数.值.类型来使用. 其中,将函数当作一个参数和值来使用可见下: t ...
- 高阶函数---swift中的泛型介绍(一步步实现Map函数)
说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...
- 在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客
尽管Grand Central Dispatch(GCD)已经存在一段时间了,但并非每个人都知道怎么使用它.这是情有可原的,因为并发很棘手,而且GCD本身基于C的API在 Swift世界中很刺眼. 在 ...
随机推荐
- 潭州课堂25班:Ph201805201 第三课:序列类型的方法 (课堂笔记)
列表的方法: li = [] 添加: li.append( 'a' ) 追加元素进入列表 li.insert( 1, 'b' ) 插入元素到指定索引位置 ----->>> li.i ...
- crm的知识点整理
''' # 1. 通过ChangeList封装好多数据 # 2. 销售中公共资源:Q查询,3天 15天 from django.db.models import F,Q F 使用查询条件的值,专门取对 ...
- php get_magic_quotes_gpc()函数使用
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post.get.cookie过来的数据增加转义字符"\",以确保这些数据不会引起程序,特别 ...
- java删除文件操作代码备忘
/** * 删除目录下的所有文件及其自身 * @param file */ private static void deleteFile(File file) { if (file.exists()) ...
- db2 查询表空间使用情况
1.SQL 查询(选择Schema为SYSPROC) SELECT SUBSTR(TABLESPACE_NAME,1,20) AS TBSPC_NAME, bigint(TOTAL_PAGES * P ...
- python面向对象笔记
一.封装(属性/私有方法/公有方法/静态方法/构造函数...) # 定义一个类 class Animal: # 私有成员(用_开头的约定为私有成员 - 注:仅仅是君子协定) _age = 0 # 构造 ...
- PHP的unset究竟会不会释放内存?
首先让我们看一个例子 var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage( ...
- 【.NET线程--进阶(一)】--线程方法详解
上篇博客从线程的基本概况开始着重讨论了线程,进程,程序之间的区别,然后讨论了线程操作的几个类,并通过实例来说明了线程的创建方法.本篇博客将会带大家更深入的了解线程,介绍线程的基本方法,并通过一个Dem ...
- CentOS 7安装SSHFS 实现远程主机目录 挂载为本地目录
安装sshfs 官方下载地址 https://github.com/libfuse/sshfs/releases 首先,我们需要安装sshfs软件.sshfs是一个基于SSH文件传输协议的文件系统客户 ...
- Android性能优化-App后台优化
原文链接 Background Optimizations 前言 后台进程是内存和电池敏感的.一个隐式的broadcast可能会启动很多监听它的后台进程,即使这些进程可能做得工作不多.这可能丢设备性能 ...