歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Swift之“閉包”的應用

相信了解swift的,都應該知道,swift捨棄了OC中的block,但是block的應用又比較靈活,作用也很強大。swift中當然不能缺少這樣的設計模式,於是推出了閉包,其功能和作用與OC的block有著異曲同工之妙,但是在寫法上,差距比較大。本文,主要是來一探“閉包”的使用方法。
一:閉包簡介
  1,閉包也是一個函數,函數是什麼?函數就是一段代碼塊。這個沒有什麼可糾結的。  2,閉包的使用方法,閉包主要有兩種使用方法,1),閉包在方法中的應用。2),閉包在屬性中的應用。
二:閉包的結構分析
  mathFunction:(text:String) -> Void
mathFunction是閉包的名字(名字後面必須跟冒號)()小括號裡面的是參數text是參數名String是參數類型->指向意思,其後面表示的就是返回值類型了注:如果是要帶多個參數的話,其格式為(參數:參數類型 , 參數:參數類型)中間用逗號隔開。
三:閉包在方法的應用
方式1:直接在方法中插入閉包
  /**閉包在方法中應用*/
  func dataBack(str:String , mathFunction:(text:String) -> Void){

      print("\(str)");
      mathFunction(text: "這是閉包在方法中的應用");
  }
這種定義方式,其帶了兩個參數,一個是Sting類型的,一個就是閉包,只不過閉包比較特殊,你可以理解為參數,也可以有其它理解。
    mathFunction(text: "這是閉包在方法中的應用");
這句代碼是調用閉包,此代碼中,是在方法裡面調用了閉包,也就是在調用這個方法時,閉包也會被自動調用。如果你想在其它地方調用閉包,這時候就用到屬性了,在這裡就先不說了,在方式二中,我會講到。
方式2:使用typealias定義閉包,放到方法和屬性中。
 其相當於別名的作用了,先定義一個別名為newFuncy的閉包      typealias newFuncy = (text : NSString) -> Void;
定義一個myFuncy屬性,其類型為newFuncy,其作用會在下面講到var myFuncy:newFuncy?;
/**閉包在方法中第二種應用*/
func secondDataBack(str:String , mathFunction:newFuncy){

    print("\(str)");
    self.myFuncy = mathFunction;
}
這是使用typealias定義的閉包,在方式一中,我是在方法中直接調用閉包,在這裡,就是我要講的是,如果你想在其他地方,調用閉包的話,這時,你在方法中,將方法帶有的閉包,賦值給你自己定義的屬性閉包,在你想要調用閉包的地方,調用這個屬性就可以了。相信這點大家都能理解吧!如果有不理解的,可以隨時提問。
四:屬性閉包的使用
如果上面的方式,大家覺得比較繁瑣,想像block一樣,在屬性中簡單靈活的運用,在這裡,我告訴大家,是可以的。
首先定義一個閉包屬性(當然你也可以采用typealias的方式來定義)
//閉包的屬性的用法
var my:((text : NSString) -> Void)?;
我們都知道block定義成屬性時,我們可以直接用他的set方法,這樣,在block被調用時,其set方法內部的代碼就會執行,但是閉包的,可以用set方法嗎?swift中,set方法寫起來也比較費勁,而且這樣定義的屬性,不能直接調用set方法吧?
筆者在探究過程中,是沒有成功的寫出它的set方法,如果有寫出來的,希望你能在評論中加上,定當感激不盡。
來看一看,我自己探索出來的寫法吧!
//利用閉包屬性傳遞消息,注意,此代碼不能寫在與屬性閉包定義的同一個類裡,  會崩潰,具體崩潰原因,正在思考。
    viewC!.my = { (text) -> Void in
        self.str = "sss";
        print(text);
    }
這是筆者自己探究出來的一種寫法,這樣在調用閉包時,in後代碼就會執行。裡面的注意,相信大家也都看到了,有興趣的可以去嘗試下,筆者目前猜測,崩潰原因與“視圖構造器”有關。如果有大神,能給出詳細的解釋,筆者跪謝啊。
最後一點,也是很多初學者經常容易忘得了,那就是在屬性閉包調用時,要加一個判斷,加什麼判斷呢?----->判斷閉包是否存在。 為什麼加判斷呢?---->為了使邏輯更嚴謹,代碼更安全。
  if((self.my) != nil){
      my!(text:"這是閉包在屬性中的應用");
    }
判斷方式,類似上面的代碼。
五:閉包中類似block的引用計數增加的探究
首先定義兩個屬性,其實兩個可以說成一個。
var str:NSString?;

var _str:NSString{

    set{
        str = newValue;
    }

    get{
        return str!;
    }
}
然後在屬性閉包,和方法閉包中分別給這兩個屬性賦值。
viewC!.my = { (text) -> Void in

        self.str = "sss";
        self._str = "ssss"
    }

viewC?.dataBack("傳給帶閉包的方法的參數", mathFunction: { (text) -> Void in

        self.str = text;
        self._str = "ssss"
    });
通過探究發現,筆者的這兩種閉包的寫法,在其內部使用全局變量,是不會有黃色警告的,也就是說,沒有對變量進行引用計數+1。說到這裡,筆者突然想到一個問題,swift也是采用ARC來管理內存的嗎?有空得去查下資料,這是因為筆者在寫簡書時,突然想到的,所以等筆者查完以後,在其它文章裡寫這些吧。

下面關於Swift的內容你可能也喜歡

Ubuntu 14.04.4 下安裝 Swift 2.2.1  http://www.linuxidc.com/Linux/2016-05/131249.htm

Ubuntu 15.10安裝部署Swift開發環境  http://www.linuxidc.com/Linux/2016-01/126995.htm 

Swift 的變化:從 2.2 到 3.0 會帶來什麼  http://www.linuxidc.com/Linux/2015-12/126440.htm 

Swift 正式開源,同時開源 Swfit 核心庫和包管理器 http://www.linuxidc.com/Linux/2015-12/125847.htm 

Apple Swift學習教程  http://www.linuxidc.com/Linux/2014-09/106420.htm 

使用 Swift 構建一個 iOS 的郵件應用 http://www.linuxidc.com/Linux/2014-08/105542.htm 

Swift 2.0開源化  http://www.linuxidc.com/Linux/2015-06/118594.htm 

Linux下搭建Swift語言開發學習環境 http://www.linuxidc.com/Linux/2015-12/125983.htm 

Swift 的詳細介紹:請點這裡 

Copyright © Linux教程網 All Rights Reserved