import Foundation
/*
func 函数名 (参数名:参数类型) { }
func 函数名 (参数名:参数类型) ->Void{ }
func 函数名 (参数名:参数类型) ->返回类型{ }
*/
func show_Array(tempArray: [Int]){
for a in tempArray {
println("\(a)")
} }
func show_Arrays(tempArray:Array<Any>){
for a in tempArray {
println("\(a)")
} }
//show_Array([2,3,4,5,6,2,1,3,2])
//show_Arrays([2,3,"abc"])
func maxOfValue(start : Int ,end : Int)->Int {
if start>end {
return start
}
return end
}
var temp = maxOfValue(,)
println(temp) func showHello(){
println("Hello World")
}
showHello() //返回多个值 即返回一个元组类型
func returnMoreValue(t1:(Double,Double),t2:(Double,Double)) ->(width:Double,height:Double) {
return (abs(t1.-t2.),abs(t1.-t2.))
} func returnMoreValue_1(t1:(Double,Double),t2:(Double,Double)) ->(Double,Double) {
return (abs(t1.-t2.),abs(t1.-t2.))
}
//函数的内部参数和外部参数
func returnMoreValue_2(t1 a: Double,t2 b: Double) ->Double {
//使用时只能用内部参数
return a/b
}
//函数的内部参数和外部参数 与 returnMoreValue_2相同
func returnMoreValue_3(#t1: Double,#t2: Double) ->Double {
//使用时只能用内部参数
return t1/t2
} let p0 : (Double,Double) = (,)
let p1 : (Double,Double) = (,)
let p_v=returnMoreValue(p0,p1)
println(p_v.width)
//调用 函数传递外部参数
println(returnMoreValue_2(t1: 3.3, t2: 2.3))
println(returnMoreValue_3(t1: , t2: 6.6)) //默认参数
func joinString(s1: String ,toString s2: String ,joiner s3: String = " && ")->String { return s1+s3+s2
}
func joinString1(s1: String ,toString s2: String ,joiner: String = " && ")->String { return s1+joiner+s2
} let str=joinString("hello", toString: "world", joiner: "#")
println(str) let stra=joinString("hello", toString: "world")
println(stra)
joinString1("lsq", toString: "Liu", joiner: "#")
joinString1("lsq", toString: "Liu") //参数的常量和变量
//传递给函数的参数默认是常量,不可以修改 如果想修改参数的值,需要在参数定义的时候指定参数变量形式 var
func swap(a: Int ,var b: Int) {
let t=b
b=a
}
//输入输出 函数inout 类似于c#中的值类型与引用类型
func swap1(inout a : Int ,inout b : Int){
let t=a
a=b
b=t
} var x=
var y=
swap1(&x, &y) //& 表示传递变量地址
println("\(x),\(y)") //变参函数
//不确定参数的个数
//通常写法
func add(array: [Int])->Int{
var sum=
for i in array {
sum+=i
}
return sum
}
//标准写法 参数个数不确定多时候 变量名: 类型...
func add1(array: Int...)->Int{
var sum=
for i in array {
sum+=i
}
return sum
}
var temp_t = add([,,,,,])
println(temp_t) var temp1=add1(,,,,,,,)
println(temp1) //函数的类型
//给函数总结一下类型 (Int,Int)->Int
func m_add(a: Int ,b: Int)->Int{
return a+b
}
func m_sum(a: Int,b: Int)->Int{
return a-b
}
//定义函数类型的变量
var calFunc:(Int,Int)->Int = m_add;
//定义了参数 那么调用函数
println(calFunc(,))
calFunc = m_sum
println(calFunc(,)) //闭包 可以理解为匿名函数 有参数有返回值 没有函数名称
//嵌套函数
/*
闭包表达式语法
{
(参数) -> 返回值类型 in
执行语句
} in 用来分割类型及执行语句 */
//定义一个闭包表达式常量
let sayHello = {
println("无参数无返回值的匿名函数,即闭包表达式")
}
//调用
sayHello() //定义一个闭包表达式的常量 ,add_b类型是(Int,Int)->Int
let add_b = {(a: Int,b: Int)-> Int in
return a+b
}
//调用
println(add_b(,)) //闭包表达式 回调用法 常用用法 将闭包作为一个函数的回调 func showArray(array : [Int]) {
for a in array {
//print("\(a) ")
}
println(array)
} //普通的 冒泡排序
func bubbleSort(inout array: [Int]){
let cnt=array.count
for var i = ; i < cnt; i++ {
for var j = ; j < cnt-i; j++ {
if (array[j] > array[j+]) {
var t = array[j]
array[j] = array[j+]
array[j+] = t
}
}
}
}
var array: Array<Int>=[,,,,,,,,]
show_Array(array)
bubbleSort(&array)
println(array) //用闭包改造
func bubbleSort1(inout array: [Int],cmp:(Int,Int) -> Int){
let cnt=array.count
for var i = ; i < cnt; i++ {
for var j = ; j < cnt-i; j++ {
if (cmp(array[j],array[j+]) == -) {
var t = array[j]
array[j] = array[j+]
array[j+] = t
}
}
}
}
var array_b1=[,,,,,,,,]
//定义一个比较 闭包
let intCmp = {
(a: Int,b: Int) -> Int in
if a>b{
return -
}else if a<b {
return
}else {
return
}
}
//可以这么调用
bubbleSort1(&array_b1,intCmp)
//也可以这么调用 这种方式较多人用
bubbleSort1(&array_b1,{
(a: Int,b: Int) -> Int in
if a>b{
return -
}else if a<b {
return
}else {
return
}
})
println(array_b1) /*
闭包表达式的优化
1.类型 返回值 让编译器去推断
*/
bubbleSort1(&array_b1,{
(a,b) in
if a>b{
return -
}else if a<b {
return
}else {
return
}
})
println(array_b1)
/*
2.变量名称优化缩写
第一个参数 $0 后面的参数以此类推 $1 $2 $3 ...
*/
bubbleSort1(&array_b1,{
let a = $ , b = $
if a>b{
return -
}else if a<b {
return
}else {
return
}
})
println(array_b1)
//3.简单的闭包表达式代码可以更简洁 /*
{
(a: Int,b: Int) -> Bool in
return a > b
}
优化:
{
return $0 > $1
} 优化:
{
$0 > $1
} */ //尾随闭包
//当闭包表达式是函数的最后一个参数时可以用尾随闭包的书写方式,即将闭包表达式写在函数后面,如
bubbleSort1(&array_b1){
let a = $ , b = $
if a>b{
return -
}else if a<b {
return
}else {
return
}
}
println(array_b1)
//优化尾随闭包
bubbleSort1(&array_b1){
if $>${
return -
}else if $<$ {
return
}
return
}
println(array_b1) //嵌套函数 值捕获 //定义一个函数,范围值是一个闭包类型 函数中定义一个函数,函数中返回一个函数
func get_value(inc: Int) -> (Int)->Int {
func incFunc(v: Int) -> Int{
return inc+v
}
return incFunc
} func get_value1(inc: Int) -> (Int)->Int {
var mt =
func incFunc(v: Int) -> Int{
mt++
return inc+v+mt
}
return incFunc
}
let incFunc1=get_value()//声明一个变量,调用get_value函数,得到闭包 即该变量是一个闭包
println(incFunc1())//调用闭包 let incFunc2=get_value1()
println(incFunc2())
println(incFunc2())
 

初学swift笔记 函数(六)的更多相关文章

  1. 初学swift笔记 结构体(八)

    import Foundation /* 和类很相似 结构体 -> 封装 属性.方法 结构体是值类型 */ //定义一个LSQ类型的结构体 关键字struct struct LSQ { var ...

  2. 初学swift笔记运算符(二)

    swift 中的运算符 import Foundation //字符类型 var char: Character = "a" char="b" println( ...

  3. 初学swift笔记变量的定义(一)

    swift变量的定义 1 import Foundation /* 变量的定义 变量的类型是可以不用写的 var a=10 常量的定义 let修饰 */ print(a) let b= print(b ...

  4. 初学swift笔记 继承(十)

    import Foundation /* 继承 class childClass: FatherClass{ } 优点 代码重用 缺点 增加程序的藕合度 父类的改变会影响子类 只能单继承 */ cla ...

  5. 初学swift笔记 方法(九)

    import Foundation /* 方法 */ //实例方法 一定需要依附于对象 class MyPoint { var x: Double = 0.0 var y: Double = 0.0 ...

  6. 初学swift笔记 枚举(七)

    import Foundation /* 枚举 语法结构 enum 类型 { case 值 } */ //定义一个枚举 写法1 enum LiuShiQun { case Name case Age ...

  7. 初学swift笔记 流程控制(五)

    import Foundation ; i<=; i++ { println(i) } let str1="adl;fjasdfl;ouewrouqwperuadf" for ...

  8. 初学swift笔记字典、数组(四)

    import Foundation //字典 元素顺序是无序的 //1.字典元素是键值对 (key:value) //key 一定是可哈希的 string\int\bool var dic1=[&qu ...

  9. 初学swift笔记-数组、字典、元组(三)

    数组的使用.字典的使用.元组的使用 import Foundation //1.定义数组 //集合数据 数组.字典 ,,,]//常用定义 ,,,]//常用定义 ,,,]//范型定义 ,,,] arr_ ...

随机推荐

  1. 写一个Windows上的守护进程(1)开篇

    写一个Windows上的守护进程(1)开篇 最近由于工作需要,要写一个守护进程,主要就是要在被守护进程挂了的时候再把它启起来.说起来这个功能是比较简单的,但是我前一阵子写了好多现在回头看起来比较糟糕的 ...

  2. TableLayout属性

    整理于http://naotu.baidu.com/file/e5880b84b1a906838116f7a45f58de78

  3. 2、vector的实现

            看侯捷老师的<STL源码剖析>有一段时间了,打算自己整理一下思路,试着实现一下.主要目的有两个:1.巩固自己对源码的理解,让自己更加深刻的体会其中各种机制的奥妙.别人的知识 ...

  4. 如何使用composer?

    /** *@测试环境:我笔记本 本地xampp集成环境 *@操作系统:Windows 7 **/   安装方法:官方有很详细的介绍,这里就不重复造轮子了. 官方链接:http://docs.phpco ...

  5. 函数 - PHP手册笔记

    用户自定义函数 函数无需在调用前被定义,除非是有条件定义的. PHP中的所有函数和类都具有全局作用域.PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数. 特意试了下,我的电脑上的PHP递归 ...

  6. 自定义filter

    class md5_filter extends php_user_filter{ public function filter($in,$out,&$consumed,$closing){ ...

  7. setTimeout setInterval 带参数的问题

    转载http://www.jb51.net/article/36233.htm 在JS中无论是setTimeout还是setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要 ...

  8. Oracle EBS-SQL (PO-14):检查供应商信息sql

    select pvs.org_id, pvs.vendor_id, pvs.vendor_site_id, hou.name                                 经营组织, ...

  9. 打开本地STL文件并创建webgl使用的geometry

    需求 打开本地STL文件 一个独立基于webgl的viewer,会被别的网站重用 将打开文件的数据传输给viewer,并且在文件加载的时候显示进度条 解决方案 #1可以使用传统的html5 api来打 ...

  10. Android(digest)

    Android开发者文档这么说的: Content providers manage access to a structured set of data. They encapsulate the ...