swift 函數(shù)與閉包

1.函數(shù)的定義與使用

//求兩個數(shù)之和的函數(shù)
//函數(shù)定義
//格式:func 函數(shù)名 (形參列表) -> 返回值類型 { 函數(shù)體}
 func sum (number1:Int, number2:Int) -> Int{
     return number1 + number2;
 }
//函數(shù)的使用
let sumTwoNubmer = sum(2, number2: 3);

2.函數(shù)的形參的注意點
2.1默認形參是常量,若要在函數(shù)中對形參改變,在形參前加上var修飾
2.2給參數(shù)添加一個名字,調(diào)用函數(shù)的時候就一目了然

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

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

2.3形參的址傳遞:用inout 修飾形參,調(diào)用的時候用&

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

2.4不定參數(shù)函數(shù)
說明:形參的個數(shù)是不定的妖啥,但是形參的類型必須是相同的,不定個數(shù)的形參實際上是一個數(shù)組


1451876890323984.png

2.5默認形參:每個參數(shù)都是有名字的,調(diào)用函數(shù)的時候,可以給任意一個參數(shù)賦值,其他的就去默認值

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

3.函數(shù)類型:如果幾個函數(shù)參數(shù)列表相同以及返回值類型相同,那么這兩個函數(shù)就有著相同的函數(shù)類型持隧。

//定義枚舉
enum  Type: Int{
    case jia = 0
    case cheng
}

//3.函數(shù)類型
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.函數(shù)嵌套

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應(yīng)用
說明: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("跳轉(zhuǎn)到下一界面", 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.數(shù)組中常用的閉包函數(shù)
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) //結(jié)果:517
totleGrade + everyGrade每次的運算的結(jié)果曲線
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胰伍,一起剝皮案震驚了整個濱河市捆憎,隨后出現(xiàn)的幾起案子印衔,更是在濱河造成了極大的恐慌尼变,老刑警劉巖亥宿,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卸勺,死亡現(xiàn)場離奇詭異,居然都是意外死亡烫扼,警方通過查閱死者的電腦和手機曙求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映企,“玉大人悟狱,你說我怎么就攤上這事⊙呙ィ” “怎么了挤渐?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長双絮。 經(jīng)常有香客問我浴麻,道長,這世上最難降的妖魔是什么囤攀? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任软免,我火速辦了婚禮,結(jié)果婚禮上焚挠,老公的妹妹穿的比我還像新娘膏萧。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布向抢。 她就那樣靜靜地躺著认境,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挟鸠。 梳的紋絲不亂的頭發(fā)上叉信,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音艘希,去河邊找鬼硼身。 笑死,一個胖子當(dāng)著我的面吹牛覆享,可吹牛的內(nèi)容都是我干的佳遂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撒顿,長吁一口氣:“原來是場噩夢啊……” “哼丑罪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凤壁,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吩屹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拧抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煤搜,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年唧席,在試婚紗的時候發(fā)現(xiàn)自己被綠了擦盾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淌哟,死狀恐怖迹卢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绞绒,我是刑警寧澤婶希,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蓬衡,受9級特大地震影響喻杈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狰晚,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一筒饰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壁晒,春花似錦瓷们、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘裕。三九已至,卻和暖如春攒钳,著一層夾襖步出監(jiān)牢的瞬間帮孔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工不撑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留文兢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓焕檬,卻偏偏與公主長得像姆坚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子实愚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容