函数的基本构造

基本结构

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的更多相关文章

  1. Swift - 04 - 浮点型

    import UIKit var str = "Hello, playground" // 显式定义浮点型常量 let PI:Float = 3.141592612312312 l ...

  2. 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 ...

  3. Awesome Swift

    Awesome Swift https://github.com/matteocrippa/awesome-swift A collaborative list of awesome Swift re ...

  4. Swift项目兼容Objective-C问题汇总

    Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...

  5. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...

  6. swift之函数式编程(二)

    本文的主要内容来自<Functional Programming in Swift>这本书,有点所谓的观后总结 在本书的Introduction章中: we will try to foc ...

  7. wordpress 使用less 样式无法及时刷新

    wordpress 样式无法及时刷新 wordpress编写style样式时,无法及时刷新页面,因此特意记录一番如何处理较好,网友的建议清除Chrome缓存,实时修改style携带的参数 折腾之旅开启 ...

  8. Python 爬虫系列

    爬虫简介 网络爬虫 爬虫指在使用程序模拟浏览器向服务端发出网络请求,以便获取服务端返回的内容. 但这些内容可能涉及到一些机密信息,所以爬虫领域目前来讲是属于灰色领域,切勿违法犯罪. 爬虫本身作为一门技 ...

  9. A Swift Tour(3) - Functions and Closures

    Functions and Closures 使用func来声明函数,通过括号参数列表的方式来调用函数,用 --> 来分割函数的返回类型,参数名和类型,例如: func greet(name: ...

随机推荐

  1. cocos IDE 编译lua 游戏程序的环境配置

    因为毕业设计需要用cocosIDE编译一个apk在手机上跑,所以搭建这个环境还是需要的. ps:是针对win系统的. 需要的工具: 1.cocosIDE:点击链接 (ps:据说这个软件设计有点反人类, ...

  2. flume+sparkStreaming实例 实时监控文件demo

    1,flume所在的节点不和spark同一个集群  v50和 10-15节点 flume在v50里面 flume-agent.conf spark是开的work节点,就是单点计算节点,不涉及到mast ...

  3. Windows DOS 窗口设置字体颜色

    2015-04-21 10:54:43 #include <windows.h> #include <iostream> using namespace std; #defin ...

  4. Java Programming Language Enhancements

    引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...

  5. IE8兼容性经验小结

    DOCTYPE 首先需要确保HTML页面开始部分要有DOCTYPE声明.DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档,具体会影响: 1.对标记,attributes, ...

  6. CentOS 7 最小化安装的无线网络配置

    1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ...

  7. XML特殊符号

    在XML中"<" 字符和"&"字符是严格禁止使用的.要使用这几种字符需要使用它们的实体, 下面是五个在XML文档中预定义好的实体:< < ...

  8. HttpClient 4.5.x 工具类设计与实现

    最近,业务需要在java服务端发起http请求,需要实现"GET","POST","PUT"等基本方法.于是想以 "HttpCli ...

  9. apache服务器安装以及使用passenger插件部署rails应用

    小例子可以部署在rails自带的WEBrick上,逐渐往后走还得上Apache. 安装apache服务器 命令是sudo apt-get install apache2 安装passenger插件 安 ...

  10. DISCUZ官方论坛模仿开发日志(二)

    接上一次日志:http://www.cnblogs.com/gcs1995/p/4091159.html 从上次写下项目简要分析到现在差不多两个月时间了,这两个月时间学习了很多新技术: 数据库技术: ...