Swift系列之閉包(Closure)

現(xiàn)在隨著Swift的開源局骤,許多開發(fā)者也更加傾向于Swift滤港,隨著Swift的排名不斷上升們也許不久之后就會取代OC的位置廓推,Swift是集眾多語言之長慨飘,也許剛開始接觸覺得語法怪異宵蛀,當年學OC時不也一樣覺得OC語法很糾結(jié)灸促。
下面就來了解一下猴誊,Swift中的閉包(Closure) 影涉,閉包的地位等同于OC中的Block,當然他們之間的用法也很類似!

  • 閉包格式

Swift中的閉包表達式靈活,其標準語法格式如下:

{  
   (參數(shù)列表) ->返回值類型 in 
     語句組
}

其中茵宪,參數(shù)列表與函數(shù)中的參數(shù)列表形式一樣最冰,返回值類型類似于函數(shù)中的返回值類型,但不同的是后面有in關(guān)鍵字稀火。
下面我們來寫一個簡單的閉包(Closure)暖哨,類比于OC的Block,當時的Block必須要有定義,聲明和實現(xiàn)凰狞,先來簡單回顧一下吧篇裁。 如下:[圖片上傳失敗...(image-509d83-1558575292757)]
一個簡單的OC中的Block寫法:

      void (^printBlock)(NSString *x);  
      printBlock = ^(NSString* str)  { 
           NSLog(@"print:%@", str);  
      };  
      printBlock(@"hello world!"); 

Swift中的閉包(Closure)馬上也來了:

    // 聲明一個閉包(有兩個整形參數(shù),且返回值為整形的閉包)
    var sumClosure:((a: Int, b: Int) -> Int)
    
    // 實現(xiàn)閉包
    sumClosure = {  (a: Int, b: Int) -> Int in 
         return a + b
    }

    // 調(diào)用
    let sum = sumClosure(a: 10,b: 20)print(sum)

是不是類似赡若,這樣學習起來就不會覺得別扭了达布,怪的是語法書寫,原理是相同的逾冬,學習一門語言就是這樣黍聂,原理搞懂了,學起來就輕松了身腻!

  • 閉包(Closure)簡化寫法

Swift提供了多種閉包簡化寫法分冈,我來介紹下面幾種不同形式:

// 形式1: 帶有參數(shù)參數(shù)類型,參數(shù)名霸株,返回值類型
 sumClosure = { (a: Int, b: Int) -> Int in return a + b}

// 形式2: 省略參數(shù)類型
sumClosure = { (a,b) -> Int in return a + b}

// 形式3: 省略返回值類型
sumClosure = { (a,b) in return a + b}

// 形式4:省略參數(shù)小括號
sumClosure = { a,b in return a + b}

// 形式5: 省略參數(shù)
sumClosure = { return $0 + $1}

// 形式6: 省略關(guān)鍵字
returnsumClosure = { $0 + $1}

  • 閉包(Closure)重定義

說到這里,大家是不是想到了 typedef 這個關(guān)鍵字了集乔,但是在Swift中去件,換成 typealias ,當然作用是一樣的扰路。

// 有參數(shù)無返回值的
 typealias Myclosure1 = (str:String) ->Void

// 有參數(shù)無返回值的
typealias Myclosure2=(str:String) ->String

// 兩個參數(shù),一個返回值
typealias Myclosure3=(str:String,str:String)->String

// 無參數(shù)尤溜,無返回值
typealias Myclosure4=()->Void

使用如下:

  var closure1: Myclosure1?
   closure1 = { (str: String) ->Void in 
        print(str)
    } 
   closure1!(str: "HelloWorld")

  • ** 閉包(Closure)作為方法的參數(shù)**

// MARK: - 閉包作為方法參數(shù)
 var closure4:Myclosure4?
 closure4 = { 
    print("Swift")
 }

 func Fun(myclosure: Myclosure4) { 
    myclosure()
 }

 Fun(closure4!)

  • 閉包(Closure)傳值

這里以兩個界面之間傳值為例,在第一個界面設(shè)置一個UILable,將第二個界面UITextField中的值傳到UILable上汗唱,原理和使用Block進行界面?zhèn)髦凳且粯拥模?br> 使用storyBoard直接拖得宫莱,方便快捷。
下面是示例代碼:
第一個界面 :ViewController.swift

    import UIKitclass ViewController: UIViewController { 
         @IBOutlet weak var label: UILabel!  

         override func viewDidLoad() { 
             super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. 
         } 
         override func didReceiveMemoryWarning() {        
            super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. 
         } 
         func setupClosures(str: String) -> Void { 
             label.text = str 
        }  
         @IBAction func next(sender: UIButton) { 
            let AVC: AViewController = UIStoryboard.init(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("AVC") as! AViewController
           
            // AVC.myclosures = setupClosures 
            AVC.myclosures = {[unowned self] (str: String) ->Void in 
                  self.label.text = str 
            } 
           self.navigationController?.pushViewController(AVC, animated: true) 
         }

      }

第二個界面 :AViewController.swift

     import UIKitclass AViewController: UIViewController { 
           typealias closures = (text: String) -> Void 
           @IBOutlet weak var textField: UITextField! 
           var myclosures: closures?  
          
           override func viewDidLoad() { 
                super.viewDidLoad() // Do any additional setup after loading the view.   } 
           override func didReceiveMemoryWarning() { 
                super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. 
           }  

           @IBAction func previous(sender: UIButton) { 
                if (myclosures != nil) { 
                      myclosures?(text:textField.text!) 
                } 
               self.navigationController?.popViewControllerAnimated(true) 
           }

      }

先到這里吧哩罪,大家相互學習授霸,不足還望指出!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末际插,一起剝皮案震驚了整個濱河市碘耳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌框弛,老刑警劉巖辛辨,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡斗搞,警方通過查閱死者的電腦和手機指攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僻焚,“玉大人允悦,你說我怎么就攤上這事〗δ兀” “怎么了澡屡?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咐旧。 經(jīng)常有香客問我驶鹉,道長,這世上最難降的妖魔是什么铣墨? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任室埋,我火速辦了婚禮,結(jié)果婚禮上伊约,老公的妹妹穿的比我還像新娘姚淆。我一直安慰自己,他們只是感情好屡律,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布腌逢。 她就那樣靜靜地躺著,像睡著了一般超埋。 火紅的嫁衣襯著肌膚如雪搏讶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天霍殴,我揣著相機與錄音媒惕,去河邊找鬼。 笑死来庭,一個胖子當著我的面吹牛妒蔚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播月弛,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼肴盏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帽衙?” 一聲冷哼從身側(cè)響起叁鉴,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佛寿,沒想到半個月后幌墓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但壮,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年常侣,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜡饵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡胳施,死狀恐怖溯祸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舞肆,我是刑警寧澤焦辅,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站椿胯,受9級特大地震影響筷登,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哩盲,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一前方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廉油,春花似錦惠险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘶炭,卻和暖如春抱慌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旱物。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卫袒,地道東北人宵呛。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像夕凝,于是被迫代替她去往敵國和親宝穗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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