Swift 1
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 1的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- swift开发新项目总结
新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案 1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编 考虑到新项目 ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
随机推荐
- 1、初识python
1.linux下运行python脚本时,在第一行通过“#!/usr/bin/env python”指定python h.py <=> ./h.py 具有相同的效果 (h.py需要有执行权限 ...
- [Angular] Change component default template (ng-content, ng-template, ngTemplateOutlet, TemplateRef)
Here is the defulat tab header template: <ng-template #defaultTabHeader let-tabs="tabsX" ...
- [AngularFire2] Update multi collections at the same time with FirebaseRef
At some point, you might need to udpate multi collections and those collections should all updated s ...
- php用两个栈来实现队列
php用两个栈来实现队列 一.总结 我主要的问题是不知道的是题目描述,题目和贵的代码之间的关系,以及返回值 思路:A栈做入队操作,B栈做出队操作,入队的时候元素直接入A,出队的时候判断B栈是否为空,如 ...
- mac os 虚拟机安装
https://blog.csdn.net/u011415782/article/details/78505422 感谢
- 机器学习01-kNN邻近算法
k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...
- Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动
在上一篇文章<Android自定义组件系列[3]--自定义ViewGroup实现侧滑>中实现了仿Facebook和人人网的侧滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布局示 ...
- javax.servlet.WriteListener
http://www.programcreek.com/java-api-examples/index.php?api=javax.servlet.WriteListener
- [Vue] Dynamic Vue.js Components with the component element
You can dynamically switch between components in a template by using the reserved <component> ...
- Qt 无标题无边框程序的拖动和改变大小
最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的标题栏以及最大化.最小化.关闭,菜单按钮,我们就需要 setWindowFlags(Qt::FramelessWi ...