swift 函数与闭包

1.函数的定义与使用

//求两个数之和的函数
//函数定义
//格式:func 函数名 (形参列表) -> 返回值类型 { 函数体}
 func sum (number1:Int, number2:Int) -> Int{
     return number1 + number2;
 }
//函数的使用
let sumTwoNubmer = sum(2, number2: 3);

2.函数的形参的注意点
2.1默认形参是常量,若要在函数中对形参改变,在形参前加上var修饰
2.2给参数添加一个名字,调用函数的时候就一目了然

func sum (numberone number1:Int,numbertwo number2:Int) ->Int {
    
    return number1 + number2;
}

let sum1 = sum(numberone: 1, numbertwo: 3)
print(sum1)

2.3形参的址传递:用inout 修饰形参,调用的时候用&

func test1 (inout number: Int) -> Int {
    number++
    return number;
}
var addtestNumber = 10;
let addnum = test1(&addtestNumber);    //结果:11
print(addnum)              //结果:11
print(addtestNumber)    //结果:11

2.4不定参数函数
说明:形参的个数是不定的,但是形参的类型必须是相同的,不定个数的形参实际上是一个数组


1451876890323984.png

2.5默认形参:每个参数都是有名字的,调用函数的时候,可以给任意一个参数赋值,其他的就去默认值

func love (name1:String = "山伯",name2: String = "英台") {   
    print("\(name1) love \(name2)")
}
love()
love("梁山伯")
love("梁山伯", name2: "祝英台")

3.函数类型:如果几个函数参数列表相同以及返回值类型相同,那么这两个函数就有着相同的函数类型。

//定义枚举
enum  Type: Int{
    case jia = 0
    case cheng
}

//3.函数类型
func jia (n1: Int,n2: Int) -> Int{
    return n1 + n2;
}
func cheng (n1: Int,n2: Int) -> Int{
    return n1 * n2;
}


func typeName(type:Type) -> ((Int,Int) -> Int) {
    
    var myfunc: (Int,Int) -> Int
    
    switch type {
        
    case .jia:
        myfunc = jia
        
    case .cheng:
        myfunc = cheng
    }
    return myfunc
}

var myfunc: (Int,Int) -> Int
myfunc = typeName(Type.cheng)
print(myfunc(1,2))

myfunc = typeName(Type.jia)
print(myfunc(1,2))

4.函数嵌套

func typeName(type:Type) -> ((Int,Int) -> Int) {    
    func jia (n1: Int,n2: Int) -> Int{
        return n1 + n2;
    }
    func cheng (n1: Int,n2: Int) -> Int{
        return n1 * n2;
    }
    var myfunc: (Int,Int) -> Int
    switch type {       
    case .jia:
        myfunc = jia        
    case .cheng:
        myfunc = cheng
    }
    return myfunc
}

5.闭包:等同于OC中的block
5.1定义

var myCloure0:((Int, Int) -> Int)?
//或者
typealias MyClosureType = (Int, Int) -> Int
var myCloure:MyClosureType?

5.2应用
说明:A控制器有两个控件,Lable和按钮,B控制器有三个控件,textfield和俩按钮,点击A按钮进入B控制器,在B控制的textfield中输入字符串,点击确定按钮把textfield中的字符串在A控制器的lable中显示,或者点击返回按钮直接返回

//A控制器--ViewController
//  Created by Vanessa on 16/3/29.
//  Copyright © 2016年 Vanessa. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
    var showLable: UILabel?
    var pushBtn: UIButton?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //1. 添加lable控件
        showLable = UILabel.init(frame: CGRectMake((UIScreen.mainScreen().bounds.size.width - 200) * 0.5, 100, 200, 44))
        showLable?.backgroundColor = UIColor.blueColor()
        self.view.addSubview(showLable!)
        
        //2. 添加按钮控件
        pushBtn = UIButton.init(type: UIButtonType.Custom)
        pushBtn?.frame = CGRectMake((UIScreen.mainScreen().bounds.size.width - 200) * 0.5, 200, 200, 44)
        pushBtn?.backgroundColor = UIColor.grayColor()
        pushBtn?.setTitle("跳转到下一界面", forState: UIControlState.Normal)
        pushBtn?.titleLabel?.textColor = UIColor.whiteColor()
        pushBtn?.addTarget(self, action: Selector.init(stringLiteral: "pushToSectionVC"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(pushBtn!)        
//        self.view.backgroundColor = UIColor.redColor()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    } 
  
//MARK: - event   
    func pushToSectionVC() {        
        let secVC: SecondViewController = SecondViewController()
        secVC.setMyblock {(str: String) -> Void in            
            self.showLable?.text = str
        }
        self.presentViewController(secVC, animated:true, completion: nil)       
    }
}
//B控制器--SecondViewController

import UIKit
class SecondViewController: UIViewController {
    
    var myBlock: ((str:String) -> Void)?
    var textField: UITextField?
    var backBtn: UIButton?
    var sureBtn: UIButton?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        self.view.backgroundColor = UIColor.whiteColor()
        
        textField = UITextField.init(frame: CGRectMake((UIScreen.mainScreen().bounds.size.width - 100) * 0.5, 100, 100, 44))
        textField?.backgroundColor = UIColor.greenColor()
        self.view.addSubview(textField!)
        
        backBtn = UIButton.init(frame: CGRectMake(50, 200, 60, 40))
        backBtn?.setTitle("返回", forState: UIControlState.Normal)
        backBtn?.backgroundColor = UIColor.blueColor()
        backBtn?.addTarget(self, action: Selector.init(stringLiteral: "back"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(backBtn!)
        
        sureBtn = UIButton.init(frame: CGRectMake(200, 200, 60, 40))
        sureBtn?.setTitle("确定", forState: UIControlState.Normal)
        sureBtn?.backgroundColor = UIColor.blueColor()
        sureBtn?.addTarget(self, action: Selector.init(stringLiteral: "sure"), forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(sureBtn!)        
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }    
    func setMyblock(tempBlock: (str:String) -> Void) {
        self.myBlock = tempBlock
    }    
    //MARK: - event
    func back() {
        self.dismissViewControllerAnimated(true, completion: nil)
    }    
    func sure() {
        if let string = textField?.text {
            myBlock!(str: (textField?.text!)!)
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    }    
}

效果图


viewController

SecondViewController

6.数组中常用的闭包函数
6.1映射(map)

let items = [1,2,3,4,5]
let strItems = items.map { (number: Int) -> String in
    return ("我是\(number)号")
}

6.2过滤器(Filter)

let score = [98,88,69,100,85,77]
let grade = score.filter { (score: Int) -> Bool in
    return score >= 85
}
print(grade) //[98, 88, 100, 85]

6.3Reduce

let totle = score.reduce(0) { (totleGrade: Int, everyGrade: Int) -> Int in
    return totleGrade + everyGrade
}
print(totle) //结果:517
totleGrade + everyGrade每次的运算的结果曲线
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容