亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS swift3.0 下閉包語法整理

2020-07-26 03:05:35
字體:
來源:轉載
供稿:網友

IOS swift3.0 下閉包語法整理

一、閉包的概念

有oc基礎的都知道,閉包其實是oc里面的block,語法格式不一樣,但作用是一樣的。主要是用于callBack(異步回調)或者兩個類之間的通信。它的本質一個函數,一個可執行的代碼塊,只是這個函數是沒有名字的,也就是匿名函數。你也可以把他看作如 int、float一樣,是一種數據類型,一種可以作為參數傳遞的數據類型。

二、基本語法

1、閉包的聲明

 //定義一個求和閉包    //閉包類型:(Int,Int)->(Int)    let add:(Int,Int)->(Int) = {      (a,b) in      return a + b;    }   //執行閉包,相當于調用函數    let result = add(1100, 200);    //打印閉包返回值    print("result=/(result)");

閉包類型是由參數返回值決定,如上述add閉包類型為(Int,Int)->(Int),箭頭前面括號是參數類型,多個參數逗號隔開,箭頭后面括號返回值類型。

分析下上面代碼,“=”左邊的“ let add:(Int,Int)->(Int) ”意思是聲明一個add常量,add是一個閉包類型,并且這個閉包的類型是:(Int,Int)->(Int)。

“=”右邊是一個代碼塊,即閉包的具體實現,相當于給左邊add常量賦值。代碼塊的語法格式:

{    (參數1,參數2) in    //code }

參數和需執行的代碼(code)用 關鍵字“in”隔開,如果閉包沒有參數, “ () in”可以直接省略:

{  //code }

你也可以用關鍵字“typealias”先聲明一個閉包的數據類型

import UIKit//聲明一個閉包類型 AddBlocktypealias AddBlock = (Int,Int)->(Int);class ViewController: UIViewController {  override func viewDidLoad() {    super.viewDidLoad()    let add:AddBlock = {      (a,b) in      return a + b;    }   let result = add(1100, 200);    print("result=/(result)"); }}

3、閉包的用法

1、兩個類之間的通信

ios中類之間的通信方式有多種,常用的有:協議代理、通知,以及本章要講的閉包。因為協議代理用起來比較麻煩,又是聲明協議方法、又要設置代理的,代碼步驟太多,我一般不用;通知一般用于兩個完全沒有關聯的類通信,可以一對多,但解耦和的太厲害,我一般是特定的場合用。所以針對有關聯的兩個類之間的通信,我一般是用閉包或block的,這樣比較簡潔迅速。

示例程序:監聽控制器上一個自定義view按鈕的點擊


界面效果

CustomView類中代碼

class CustomView: UIView {  //聲明一個屬性btnClickBlock,type為閉包可選類型  //閉包類型:()->() ,無參數,無返回值  var btnClickBlock:(()->())?;  //重寫 init(frame: CGRect)構造函數  override init(frame: CGRect) {    super.init(frame:frame);    //創建按鈕    let btn = UIButton(frame: CGRect(x: 15, y: 15, width: 80, height: 32));    btn.setTitle("按鈕", for: .normal);    btn.backgroundColor = UIColor.blue;    //綁定事件    btn.addTarget(self, action: #selector(CustomView.btnClick), for: .touchDown);    //添加    addSubview(btn);  }  //按鈕點擊事件函數  func btnClick(){    if self.btnClickBlock != nil {      //點擊按鈕執行閉包      //注意:屬性btnClickBlock是可選類型,需要先解包      self.btnClickBlock!();    }  }  required init?(coder aDecoder: NSCoder) {    fatalError("init(coder:) has not been implemented")  }}

Controller類中代碼:

class ViewController: UIViewController {  override func viewDidLoad() {    super.viewDidLoad()    //創建CustomView對象    let cutomeView = CustomView(frame: CGRect(x: 50, y: 50, width: 200, height: 200));    //給cutomeView的btnClickBlock閉包屬性賦值    cutomeView.btnClickBlock = {      // () in 無參數可以省略      //當按鈕被點擊時會執行此代碼塊      print("按鈕被點擊");    }    cutomeView.backgroundColor = UIColor.yellow;    //添加到控制器view上    self.view.addSubview(cutomeView);  }}

2、異步回調(callBack)

以發送一個簡單的網絡請求為例:

/// 定義一個網絡請求函數  ///  /// - parameter urlString: 請求接口  String  /// - parameter succeed:  成功的回調 可選閉包  /// - parameter failure:  失敗的回調 可選閉包  func requestData(urlString:String,succeed: ((Any?)->(Void))?,failure:((Any?)->(Void))?){    let request = URLRequest(url: URL(string: urlString)!);    //發送網絡請求    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in      if error == nil {        //請求成功,執行成功的回調,并把數據傳遞出去        succeed?(data);      }else{         //請求失敗,執行失敗的回調,并把錯誤傳遞出去        failure?(error);      }    }  }
// 調用函數requestData函數    requestData(urlString: "http://www.baidu.com", succeed: { (data) -> (Void) in      //成功的回調      guard let result = data as? Data else{        return;      }      let srt = NSString(data: result, encoding: String.Encoding.utf8.rawValue);      print(srt!)      }) { (error) -> (Void) in        //失敗的的回調        print(error);    }

四、閉包的一些特殊語法

1、尾隨閉包

當閉包作為函數的最后一個參數時,可以省略前面的括號。尾隨閉包沒什么特殊的作用,純粹是一種語法上的簡潔,增加易讀性。

例:定義一個函數:

//第二個參數:閉包 (String)->(Void)func post(url:String,succesce:(String)->Void) {    print("發送請求");    succesce("請求完成");  }

執行函數,正常寫法:

 //正常寫法,第二個參數,傳遞一個閉包   post("http", succesce: {      //閉包傳遞的參數      (json) in      //執行的代碼       print(json);    });

執行函數,尾隨閉包寫法:

//尾隨閉包,當閉包作為函數的最后一個參數時,可以省略前面的括號 HttpTool.post("http") { (json) in      print(json);    };

2、逃逸閉包

看起來很“吊炸天”的一個名字,其實很簡單。當閉包作為一個參數傳遞到函數時,我們知道它一般是用于函數內部的異步回調,閉包是等異步任務完成以后才調用,而函數是會很快執行完畢并返回的,所以閉包它需要逃逸,以便稍后的回調。

逃逸閉包一般用于異步函數的回調,比如網絡請求成功的回調和失敗的回調。語法:在函數的閉包行參前加關鍵字“@escaping”。

或許細心的人已經發現我上面的示例網絡請求為什么沒有出現關鍵字“@escaping”,你可以拉回去看下成功回調或失敗的回調,類型是“((Any?)->(Void))?”,后面帶了個“?”,這是閉包可選類型,并不是閉包類型,所以無需關鍵字“@escaping”。

假設成功和失敗的回調要弄成閉包類型,而你又要異步使用的話,那就要在形參前面加關鍵字,如下:

 /// 定義一個網絡請求函數  ///  /// - parameter urlString: 請求接口  String  /// - parameter succeed: 成功的回調 閉包 因需要異步使用,前面加關鍵字@escaping修飾,指明其為逃逸閉包  /// - parameter failure: 失敗的回調 閉包 因需要異步使用,前面加關鍵字@escaping修飾,指明其為逃逸閉包  func requestData(urlString:String,succeed: @escaping (Any?)->(Void),failure:@escaping (Any?)->(Void)){    let request = URLRequest(url: URL(string: urlString)!);    //發送網絡請求    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue()) { (_, data, error) in      if error == nil {        //請求成功,執行成功的回調,并把數據傳遞出去        succeed(data);      }else{         //請求失敗,執行失敗的回調,并把錯誤傳遞出去        failure(error);      }    }  }

假設成功和失敗的回調要弄成閉包類型,而你又要異步使用的話,但你又不想在形參前面加關鍵字,那對不起,我也沒有辦法,編譯直接報錯!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜美腿亚洲一区二区| 欧美日韩精品在线视频| 国产日韩欧美日韩大片| 亚洲午夜未删减在线观看| 精品久久香蕉国产线看观看gif| 中文字幕亚洲无线码a| 欧美夜福利tv在线| 91九色国产视频| 日韩在线视频国产| 国产a∨精品一区二区三区不卡| 精品国产区一区二区三区在线观看| 欧美性猛交丰臀xxxxx网站| 精品视频久久久久久久| 精品久久久久久中文字幕大豆网| 亚洲91精品在线| 欧美综合激情网| 91精品国产99久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 91av在线网站| 国产一区视频在线| 欧美日韩国产va另类| 亚洲色图校园春色| 亚洲国产天堂久久综合网| 日韩理论片久久| 国产一区玩具在线观看| 午夜精品www| 久久影视免费观看| 亚洲欧美制服另类日韩| 97精品在线视频| 欧美日韩另类字幕中文| 亚洲无限乱码一二三四麻| 国产精品久久久av| 欧美最猛黑人xxxx黑人猛叫黄| 韩曰欧美视频免费观看| 亚洲第一免费网站| 国产亚洲一区二区精品| 国产美女久久久| 97香蕉超级碰碰久久免费软件| 亚洲欧美色图片| 欧美视频精品一区| 全色精品综合影院| 欧美夫妻性生活xx| 高清欧美性猛交xxxx| 2021国产精品视频| 69视频在线免费观看| 韩国视频理论视频久久| 国产精品白嫩美女在线观看| 国产精品美女www| 欧美国产精品人人做人人爱| 欧美成人一区在线| 精品久久久中文| 国产69精品久久久久9999| 久久五月天综合| 精品女厕一区二区三区| 欧美精品www在线观看| 色偷偷偷综合中文字幕;dd| 另类视频在线观看| 亚洲性生活视频在线观看| 欧美最顶级丰满的aⅴ艳星| 久久久97精品| 日韩电影免费在线观看| 精品久久久久久电影| 欧美成人性色生活仑片| 日韩视频在线免费观看| 欧美丰满少妇xxxxx做受| 最近2019中文字幕mv免费看| 色综合亚洲精品激情狠狠| 在线电影欧美日韩一区二区私密| 97涩涩爰在线观看亚洲| 97色在线观看| 在线精品国产成人综合| 久久精品久久久久久| 日韩精品亚洲精品| 日本午夜人人精品| www.xxxx精品| 亚洲一区二区久久久久久久| 久久99国产精品久久久久久久久| 怡红院精品视频| 亚洲成av人乱码色午夜| 日韩欧美一区二区三区| 亚洲欧洲在线视频| 另类美女黄大片| 日韩亚洲欧美中文高清在线| 日韩免费看的电影电视剧大全| 日韩av日韩在线观看| 国精产品一区一区三区有限在线| 午夜精品久久17c| 国产成人欧美在线观看| 91亚洲国产成人久久精品网站| 国产精品自产拍在线观| 狠狠干狠狠久久| 亚洲www视频| 日韩视频精品在线| 亚洲无限乱码一二三四麻| 国产精品丝袜高跟| 亚洲精品大尺度| 国产视频在线一区二区| 亚洲精品免费一区二区三区| 亚洲aaaaaa| 欧美老肥婆性猛交视频| 91国产高清在线| 日韩国产欧美精品在线| 欧美精品www| 欧美日韩亚洲一区二| 亚洲xxxx18| 欧美性xxxx在线播放| 欧美大成色www永久网站婷| 中文字幕在线看视频国产欧美在线看完整| 国产中文字幕91| 日本伊人精品一区二区三区介绍| 91精品国产777在线观看| 亚洲国产精品高清久久久| 国产精品jvid在线观看蜜臀| 国产精品久久精品| 亚洲3p在线观看| 国内精品400部情侣激情| 亚洲专区中文字幕| 国产精品成人一区二区三区吃奶| 自拍亚洲一区欧美另类| 热久久视久久精品18亚洲精品| 亚洲欧美精品伊人久久| 精品国产拍在线观看| 日本成人免费在线| 精品国产999| 日本道色综合久久影院| 午夜精品福利电影| 色综合久久精品亚洲国产| 久久久国产91| 亚洲成人黄色网| 国产精品成久久久久三级| 欧美精品video| 久久国产精品首页| 91欧美视频网站| 成人免费淫片视频软件| 日韩精品在线观看一区| 欧美高清激情视频| 国产成人亚洲综合91| 精品国产户外野外| 色偷偷av亚洲男人的天堂| 91九色在线视频| 成人免费网视频| 国产精品久久久久影院日本| 欧美福利小视频| 久久综合久久八八| 欧美成人精品影院| 国产精品女主播视频| 亚洲男人天堂2024| 亚洲乱码国产乱码精品精天堂| 91国内揄拍国内精品对白| 欧美性资源免费| 久久精品小视频| 欧美精品在线第一页| 欧美激情欧美狂野欧美精品| 久久国产加勒比精品无码| 中文亚洲视频在线| 亚洲欧洲日产国码av系列天堂| 久久久久久97| 在线精品播放av| 欧美成人手机在线| 中文字幕日韩在线视频| 日韩av在线免播放器| 91po在线观看91精品国产性色| 日韩中文字幕在线视频| 亚洲国产精品va在线观看黑人|