Swift 04.Functions
函数的基本构造
基本结构
func 函数名 (形参名:形参类型) ->返回值 {实现代码}
如果没有参数,那么也必须把参数的括号带上
如果有多个形参,那么必须以逗号 , 隔开
如果没有返回值,那么可以省略 也可以以->Void 和 () 代替
你可以在形名前指定外部参数名,中间以空格分隔.
注意: 如果你提供了外部参数名,那么函数在被调用时,必须使用外部参数名。
第一个参数默认忽略其外部参数名称,明确写下划线是多余的
如果你不想为第二个及后续的参数设置参数名,用一个下划线(_)代替一个明确地参数名.
func someFunction(firstParameterName: Int, _ secondParameterName: Int) {
}
someFunction(, )
函数的基本类型
有参数有返回值函数
func 函数名 (形参名:形参类型) ->返回值 {实现代码}
func myName(name:String,age:Int) ->String {
return (name + "\(age)")
}
调用定义好的函数
let nema = myName("xiaoming", age: )
print(nema)
func 函数名 (外部参数名 形参名:形参类型) ->返回值 {实现代码}
func myName1(na name:String,num age:Int) ->String {
return (name + "\(age)")
}
调用定义好的函数
let nema1 = myName1(na: "xiaohong", num: ) print(nema1)
无参数 有返回值 函数
func 函数名() ->返回值 !哪怕函数没有参数 也一样要加()
func myNum() ->String{
return "无参数 有返回值"
}
let num = myNum()
print(num)
无参数无返回值函数
func 函数名() !返回值可以省略
func myReturn(){
print("无参数无返回值")
}
myReturn()
->()来标识无返回值
func myRetu()->(){
print("无参无返回值")
}
myRetu()
->Void来标识无返回值
func myRetu1()->Void{
print("无参无返回值")
}
myRetu1()
有参数 无返回值函数
func 函数名(形参:形参类型)
func myPargam(name:String,age:Int){
print(name + "\(age)")
}
myPargam("xiaowang", age: )
可变参数
最多可以有一个可变参数函数,和它必须出现在参数列表中,为了避免歧义在调用函数有多个参数。
如果 你的函数有一个或多个参数有默认值,还有一个可变的参数,将可变参写在参数列表的最后。
func arithmeticMean(numbers: Double...) -> Double {
var total: Double =
for number in numbers {
total += number }
print(numbers)
return total / Double(numbers.count)
}
let dou = arithmeticMean(,,,)
print(dou)
通过在参数名前加关键字 var 来定义变量参数:
对变量参数所进行的修改在函数调用结束后便消失了,并且对于函数体外是不可见的。变量参数仅仅存 在于函数调用的生命周期中。
func alignRight(var string: String, totalLength: Int, pad: Character) -> String {
let amountToPad = totalLength - string.characters.count
if amountToPad < {
return string
}
let padString = String(pad)
for _ in ...amountToPad {
string = padString + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, totalLength: , pad: "-")
输入输出参数
/*
*你只能将变量作为输入输出参数
*当 传入的参数作为输入输出参数时,需要在参数前加 & 符,表示这个值可以被函数修改。
*/
func swapTwoInts(inout a: Int, inout _ b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt =
var anotherInt =
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
输入输出参数和返回值是不一样的。上面的 swapTwoInts 函数并没有定义任何返回值,但仍然修改了 someInt 和 anotherInt 的值。输入输出参数是函数对函数体外产生影响的另一种方式。
默认参数值
你可以在函数体中为每个参数定义 默认值(Deafult Values) 。当默认值被定义后,调用这个函数时可以忽略这个 参数。
func someFunction(parameterWithDefault: Int = ) {
// function body goes here
// if no arguments are passed to the function call,
// value of parameterWithDefault is 42
print(parameterWithDefault)
}
someFunction()
// parameterWithDefault is 6
someFunction()
// parameterWithDefault is 12
使用函数类型
在 Swift 中,使用函数类型就像使用其他类型一样。例如,你可以定义一个类型为函数的常量或变量,并将函数 赋值给它:
addTwoInts 和 mathFunction 有同样的类型,所以这个赋值过程在 Swift 类型检查中是允许的。
func addTwoInts(a:Int,b:Int) ->Int{
return a+b
}
var mathFunction: (Int, Int) -> Int = addTwoInts
let a = mathFunction(,)
print("Result:\(a) \(mathFunction(2, 3))")
作为参数的函数
在 Swift 中,函数可以被用来当做变量传递。比如,一个函数可以含有一个函数类型的参数
func luckyNumberForName(name: String,lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % )
return lotteryHandler(name, luckyNumber)
}
func defaultLotteryHandler(name: String, luckyNumber: Int) -> String {
return "\(name), your lucky number is \(luckyNumber)"
}
luckyNumberForName("Mr. Roboto", lotteryHandl: defaultLotteryHandler)
// Mr. Roboto, your lucky number is 38
注意下只有函数的引用被传入 — 在本例中是 defaultLotteryHandler。这个函数之后是否执行是由接收的函数决定。
实例方法也可以用类似的方法传入:
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % )
return lotteryHandler(name, luckyNumber)
}
class FunLottery {
func defaultLotteryHandler(name: String, luckyNumber: Int) -> String {
return "\(name), your lucky number is \(luckyNumber)"
}
}
let funLottery = FunLottery()
luckyNumberForName("Mr. Roboto", lotteryHandl: funLottery.defaultLotteryHandler)
// Mr. Roboto, your lucky number is 38
为了让你的函数定义更具可读性,可以考虑为你函数的类型创建别名 (类似于 Objective-C 中的 typedef):
typealias lotteryOutputHandler = (String, Int) -> String
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: lotteryOutputHandler) -> String {
let luckyNumber = Int(arc4random() % )
return lotteryHandler(name, luckyNumber)
}
你也可以使用不包含参数名的函数 (类似于 Objective-C 中的 blocks):
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % )
return lotteryHandler(name, luckyNumber)
}
luckyNumberForName("Mr. Roboto", lotteryHandl: {name, number in
return "\(name)'s' lucky number is \(number)"
})
// Mr. Roboto's lucky number is 74
在 Objective-C 中,使用 blocks 作为参数是异步操作是操作结束时的回调和错误处理的常见方式,这一方式在 Swift 中得到了很好的延续。
Swift 04.Functions的更多相关文章
- Swift - 04 - 浮点型
import UIKit var str = "Hello, playground" // 显式定义浮点型常量 let PI:Float = 3.141592612312312 l ...
- Swift Standard Library: Documented and undocumented built-in functions in the Swift standard library – the complete list with all 74 functions
Swift has 74 built-in functions but only seven of them are documented in the Swift book (“The Swift ...
- Awesome Swift
Awesome Swift https://github.com/matteocrippa/awesome-swift A collaborative list of awesome Swift re ...
- Swift项目兼容Objective-C问题汇总
Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...
- swift 与 OC 混合编程
原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...
- swift之函数式编程(二)
本文的主要内容来自<Functional Programming in Swift>这本书,有点所谓的观后总结 在本书的Introduction章中: we will try to foc ...
- wordpress 使用less 样式无法及时刷新
wordpress 样式无法及时刷新 wordpress编写style样式时,无法及时刷新页面,因此特意记录一番如何处理较好,网友的建议清除Chrome缓存,实时修改style携带的参数 折腾之旅开启 ...
- Python 爬虫系列
爬虫简介 网络爬虫 爬虫指在使用程序模拟浏览器向服务端发出网络请求,以便获取服务端返回的内容. 但这些内容可能涉及到一些机密信息,所以爬虫领域目前来讲是属于灰色领域,切勿违法犯罪. 爬虫本身作为一门技 ...
- A Swift Tour(3) - Functions and Closures
Functions and Closures 使用func来声明函数,通过括号参数列表的方式来调用函数,用 --> 来分割函数的返回类型,参数名和类型,例如: func greet(name: ...
随机推荐
- sql存储过程比sql语句执行慢很多
参数嗅探的问题 原因:(1)可能是发生了参数嗅探,第一次赋给存储过程的输入参数,会为该存储过程生成一个基于输入参数的执行计划,因此如果第一次输入的参数不具有代表性(例如大部分查询输入的参数都是A值,但 ...
- 第一、初识C语言
1·C语言强大而灵活,如python,LISP,FORTRAN,Perl,Logo,BASIC,PASACAL的编译器和解释器都是C语言编写的. 2·C语言的指针错误往往难以察觉,但这恰好告诉我们,一 ...
- 工作上遇到的问题 DEBUG 001
java文件断点跳到对应的class文件解决方式 我也是第一次遇到这个问题,找了很久解决办法.后面找开发组老大才解决. 问题描述: 调试程序,在ExportAction.java文件打断点.debug ...
- js对象/数组深度复制
今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...
- HDU 5968 异或密码
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- IOS 微信 6.5.2 自动播放音乐 解决方案
之前仅仅是IPhone7\7p 的问题,现在已经扩展到6 .6s.今天在下也行了最新微信,音乐问题果然来了. 好了 下面直接进入正题 首先 引入 <script src="http:/ ...
- kafka使用getOffsetsBefore()获取获取offset异常分析
根据时间戳获取kafka的topic的偏移量,结果获取的偏移量量数据组的长度为0,就会出现如下的数组下标越界的异常,实现的原理是使用了kafka的getOffsetsBefore()方法: Excep ...
- JVM 内存管理机制
1. 内存分配图: 两栈一区一堆一计数 方法区里面 包含了运行时常量 2. 对象创建过程: new A() 首先加载A的字节码. 分配内存,内存分配方式分两种,如果采用带压缩的垃圾回收策略,则采用“ ...
- 汇编语言写出的helloworld运行过程
一:首先说一点,这篇文章建立在懂一点汇编的基础上,有几个简单的命令,说以下: 1:-r命令 -r 查看寄存器 -r 寄存器 (如 -r AX) 修改寄存器的值: 2:-d命令 -d 地址:xxxx:x ...
- (原创)RS232串口信号定义
好久没用动硬件了,串口更是好久没用用了. 曾经接口信号记得很清楚,久了,忘了. 今天,重新回顾,笔记记下. DB9接口分公头和母头,公头即插针头,电脑机箱上多少公头.母头即插孔座. 合理的硬件设计均以 ...