Swift-閉包學(xué)習(xí)

前提:

swift語法很惡心,其中閉包占一半婴洼。沒有oc語法那么直觀嚴(yán)謹(jǐn)骨坑,太靈活也不好,有點(diǎn)類似弱語言窃蹋,很多東西很隨意卡啰,但是對于有無值和類型,卻又控制的很死警没。

一:閉包的基本幾種常見格式:

MARK1: 無參 無返回

 let driving1 = {
     print("我要去開車2")
 }    

MARK2: 有參 無返回

 let driving3 = { (place: String) in
      print("我要去開車3" + place)
  }
  driving3("xxxx")

MARK3: 有參 有返回

 let driving4 = { (place: String) -> String in
     return "我要去開車4" + place
 }
        
 let message = driving4("哈哈哈哈")
 print(message)

二:閉包的其他幾種常見格式:

MARK: 第1種寫法

 //let append = {(str1 aa:String,Str2 bb: String)-> String in 報(bào)錯(cuò)匈辱,閉包沒有外部參數(shù)名
  let append1 = {(str1:String, Str2:String) -> String in
       return "\(str1)\(Str2)"http://2030
  }
  //print(append(str1:"20",str2:"30")) 報(bào)錯(cuò)沧竟,閉包里面不用傳參數(shù)名
  print(append1("20","30"))//2030

MARK: 第2種寫法

  //以上等價(jià)于
  let append2: (String, String) -> String = {
        (str1, str2) in
         return str1 + str2
   }
   print(append2("one", "two"))//onetwo

MARK: 重命名 示例

   typealias append3 = (String) -> Void
     func getXySuFangFa(result:append3){
         result("好人一生平安")
   }
   print(getXySuFangFa(result: { (String) in
         print("\(String)")//輸出:好人一生平安
   }))     

MARK: 閉包的創(chuàng)建断楷、賦值、調(diào)用

  //方式一:利用typealias最完整的創(chuàng)建
  typealias addBlock = (_ num1: Int, _ num2: Int) -> (Int)
  //創(chuàng)建一個(gè) addBlock 類型的閉包常量:addCloser1
  let addCloser1: addBlock
  //為已經(jīng)創(chuàng)建好的常量 addCloser1 賦值
  addCloser1 = {
      (_ num1: Int, _ num2: Int) -> (Int) in
            return num1 + num2
  }
        
  //調(diào)用閉包并接受返回值
  let result1 = addCloser1(20, 10)
  print(result1)

形式二:閉包類型申明和變量的創(chuàng)建合并在一起

   let addCloser2: (_ num1: Int, _ num2: Int) -> (Int)
        //為已經(jīng)創(chuàng)建好的常量 addCloser2 賦值
     addCloser2 = {
          (_ num1: Int, _ num2: Int) -> (Int) in
           return num1 + num2
    }
        
    //調(diào)用閉包并接受返回值
    let result2 = addCloser2(20, 10)
    print(result2)        

形式三:省略閉包接收的形參亿扁、省略閉包體中返回值

  let addCloser3: (Int, Int) -> (Int)
   addCloser3 = {
      (num1, num2) in
      return num1 + num2
  }
  //調(diào)用閉包并接受返回值
  let result3 = addCloser3(20, 10)
  print(result3)

形式四:在形式三的基礎(chǔ)上進(jìn)一步精簡

 let addCloser4: (Int, Int) -> (Int) = {
        (num1, num2) in
         return num1 + num2
  }
  //調(diào)用閉包并接受返回值
  let result4 = addCloser4(20, 10)
  print(result4)

形式五:如果閉包沒有接收參數(shù)省略in

  let addCloser5: () -> (String) = {
      return "這個(gè)閉包沒有參數(shù)树酪,但是有返回值"
  }
  //調(diào)用閉包并接受返回值
  let result5 = addCloser5()
  print(result5)

形式六:簡寫的實(shí)際參數(shù)名

  let addCloser6: (String, String) -> (String) = {
       return "閉包的返回值是:\($0),\($1)"
   }
  //調(diào)用閉包并接受返回值
  let result6 = addCloser6("Hello", "Swift!")
  print(result6)     

三:閉包的幾種用法:

MARK:1 使用sort方法和閉包進(jìn)行數(shù)組排序

   /*
    sort方法返回一個(gè)數(shù)組的有序版本浅碾。
  (sort方法即為Swift2.0之前的sorted方法。而原來的sort方法改名為sortInPlace续语,用來將原數(shù)組修改成有序版本)
   */
       func fnagfa1()  {
        var numbers = [12,25,1,35,27]
        
        let numbersSorted: () = numbers.sort(by: { (n1: Int, n2: Int) -> Bool in
            //進(jìn)行從小到大的排序
            return n2 > n1
        })
        
        print(numbersSorted) //[1, 12, 25, 27, 35]
}

MARK:2 閉包可以不用指定參數(shù)類型垂谢,編譯器會幫我們推斷的

 func fnagfa2()  {
        var numbers = [12,25,1,35,27]
        
        let numbersSorted: () = numbers.sort(by: { n1, n2 in
            //進(jìn)行從小到大的排序
            return n2 > n1
        })
        
        print(numbersSorted) //[1, 12, 25, 27, 35]
  }

MARK:3 還可以省略參數(shù)名,直接根據(jù)數(shù)字來引用每個(gè)參數(shù)(0疮茄,1滥朱,$2......)

 func fnagfa3()  {
        var numbers = [12,25,1,35,27]
        
        let numbersSorted: () = numbers.sort(by: {
            //進(jìn)行從小到大的排序
            return $1 > $0
        })
        
        print(numbersSorted) //[1, 12, 25, 27, 35]
  }

MARK:4 如果閉包只包含一行代碼,可以省略return關(guān)鍵字

  func fnagfa4()  {
     var numbers = [12,25,1,35,27]
        
     let numbersSorted: () = numbers.sort(by: {
            //進(jìn)行從小到大的排序
            $1 > $0
        })
     print(numbersSorted) //[1, 12, 25, 27, 35]   
  }

MARK:5 如果一個(gè)閉包是函數(shù)調(diào)用的最后一個(gè)參數(shù)力试,可以將它放在括號外面徙邻。提高可讀性。

 func fnagfa5()  {
        var numbers = [12,25,1,35,27]
        
        let numbersSorted: () = numbers.sort(){
            //進(jìn)行從小到大的排序
            $1 > $0
        }
        print(numbersSorted) //[1, 12, 25, 27, 35]
    }

MARK:6 這個(gè)換行也是可選的畸裳,所以代碼可再次精簡

  func fnagfa6()  {
        var numbers = [12,25,1,35,27]
        
        let _: () = numbers.sort(){
            $1 > $0
            
        }
   }

MARK:7 閉包也可以存儲在變量中缰犁,像調(diào)用函數(shù)一樣調(diào)用它們

  func fnagfa7()  {
        let comparator = {(a: Int, b: Int) in
            a < b
            
        }
        
        let _ :Bool = comparator(5,2) //false
        let _ :Bool = comparator(2,5) //true
    }

四:閉包傳值:

ViewController3.m里面點(diǎn)擊按鈕,跳轉(zhuǎn)到ViewController4.m怖糊,在ViewController4.m返回的時(shí)候?qū)⒅祩鬟f到ViewController3.m里面帅容。

ViewController3.m里面

import UIKit

class ViewController3: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.white
        
        let btn  =  UIButton.init(frame: CGRect(x: 50, y: 145, width: 275, height: 44))
        self.view.addSubview(btn)
        btn.backgroundColor = UIColor.systemTeal
        btn.setTitle("點(diǎn)擊我閉包傳值", for: UIControl.State.normal)
        btn.addTarget(self, action: #selector(click), for: UIControl.Event.touchUpInside)
        
    }
    
    @objc func click() {
        let vc  =  ViewController4.init()
        vc.block = { (str1:String,str2:String) -> String in
            print("閉包傳遞的值為str1: \(str1)   str2:\(str2) ")
            return str1
        }
        self.navigationController?.pushViewController(vc, animated: true)
    }
  
}

ViewController4.m里面

import UIKit

class ViewController4: UIViewController {
    
    var block = {(str1:String,str2:String) -> String in
        return str1 + str2
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        self.block("毛阿莫","狗狗")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.white
    }
    
}

其他:

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        getData { (data) in
            print("閉包結(jié)果返回--\(data)--\(Thread.current)")
        }
    }
    
    func getData(closure:@escaping (Any) -> Void) {
        print("函數(shù)開始執(zhí)行--\(Thread.current)")
        DispatchQueue.global().async {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+2, execute: {
                print("執(zhí)行了閉包---\(Thread.current)")
                closure("345")
            })
        }
        print("函數(shù)執(zhí)行結(jié)束---\(Thread.current)")
    }
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伍伤,隨后出現(xiàn)的幾起案子丰嘉,更是在濱河造成了極大的恐慌,老刑警劉巖嚷缭,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饮亏,死亡現(xiàn)場離奇詭異,居然都是意外死亡阅爽,警方通過查閱死者的電腦和手機(jī)路幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來付翁,“玉大人简肴,你說我怎么就攤上這事“俨啵” “怎么了砰识?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵能扒,是天一觀的道長。 經(jīng)常有香客問我辫狼,道長初斑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任膨处,我火速辦了婚禮见秤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘真椿。我一直安慰自己鹃答,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布突硝。 她就那樣靜靜地躺著测摔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪解恰。 梳的紋絲不亂的頭發(fā)上避咆,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音修噪,去河邊找鬼查库。 笑死,一個(gè)胖子當(dāng)著我的面吹牛黄琼,可吹牛的內(nèi)容都是我干的樊销。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脏款,長吁一口氣:“原來是場噩夢啊……” “哼围苫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撤师,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剂府,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剃盾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腺占,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年痒谴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衰伯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡积蔚,死狀恐怖意鲸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤怎顾,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布读慎,位于F島的核電站,受9級特大地震影響槐雾,放射性物質(zhì)發(fā)生泄漏夭委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一蚜退、第九天 我趴在偏房一處隱蔽的房頂上張望闰靴。 院中可真熱鬧彪笼,春花似錦钻注、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泵肄,卻和暖如春捆交,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腐巢。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工品追, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冯丙。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓肉瓦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胃惜。 傳聞我的和親對象是個(gè)殘疾皇子泞莉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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