1碰逸、@escaping(逃逸閉包)
如果一個(gè)閉包被作為一個(gè)參數(shù)傳遞給一個(gè)函數(shù)鸟废,并且在函數(shù)return之后才被喚起執(zhí)行拾碌,那么這個(gè)閉包是逃逸閉包雁乡。并且這個(gè)閉包的參數(shù)是可以“逃出”這個(gè)函數(shù)體外的第喳。
在swift3.0之后閉包默認(rèn)是不可逃逸的,逃逸閉包需要使用@escaping屬性標(biāo)記踱稍。默認(rèn)不可逃逸閉包 最明顯的好處就是:編譯器優(yōu)化你的代碼的性能和能力曲饱。如果編譯器知道這個(gè)閉包是不可逃逸的悠抹,它可以關(guān)注內(nèi)存管理的關(guān)鍵細(xì)節(jié)。而且你可以在不可逃逸閉包里放心的使用self關(guān)鍵字渔工,因?yàn)檫@個(gè)閉包總是在函數(shù)return之前執(zhí)行锌钮,你不需要去使用一個(gè)弱引用去引用self
就是在使用該閉包之前如果該函數(shù)已經(jīng)結(jié)束調(diào)用 就需要在函數(shù)參數(shù)中添加@escaping
2、block
typealiasFKBlock1 = () -> ()
typealiasFKBlock2 = (_:Any) -> ()
3引矩、as梁丘、as!、as?
as:有保證的轉(zhuǎn)換旺韭,從派生類轉(zhuǎn)換為基類的向上轉(zhuǎn)型(upcasts)
使用場(chǎng)合:
從派生類轉(zhuǎn)換為基類氛谜,向上轉(zhuǎn)型(upcasts)
class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal
消除二義性,數(shù)值類型轉(zhuǎn)換
let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42/2) as Double
switch 語(yǔ)句中進(jìn)行模式匹配
如果不知道一個(gè)對(duì)象是什么類型区端,你可以通過switch語(yǔ)法檢測(cè)它的類型值漫,并且嘗試在不同的情況下使用對(duì)應(yīng)的類型進(jìn)行相應(yīng)的處理。
switch animal {
? ? case let cat as Cat:
? ? print("如果是Cat類型對(duì)象织盼,則做相應(yīng)處理")
? ? case let dog as Dog:
? ? print("如果是Dog類型對(duì)象杨何,則做相應(yīng)處理")
? ? default: break
}
as!:向下轉(zhuǎn)型(Downcasting)時(shí)使用。由于是強(qiáng)制類型轉(zhuǎn)換沥邻,如果轉(zhuǎn)換失敗會(huì)報(bào) runtime 運(yùn)行錯(cuò)誤危虱。
as? 和 as! 操作符的轉(zhuǎn)換規(guī)則完全一樣。但 as? 如果轉(zhuǎn)換不成功的時(shí)候便會(huì)返回一個(gè) nil 對(duì)象唐全。成功的話返回可選類型值埃跷。
4、willset didset
? ? varname:String?{
? ? ? ??willSet{
? ? ? ? ? ? NSLog("==========")
? ? ? ? }
? ? ? ??didSet{
? ? ? ? ? ? NSLog("did set "+name!)
? ? ? ? }
? ? }
5邮利、lazy 延時(shí)加載? ?懶加載屬性
延時(shí)加載或者說(shuō)延時(shí)初始化是很常用的優(yōu)化方法弥雹,在構(gòu)建和生成新的對(duì)象的時(shí)候,內(nèi)存分配會(huì)在運(yùn)行時(shí)耗費(fèi)不少時(shí)間延届,如果有一些對(duì)象的屬性和內(nèi)容非常復(fù)雜的話剪勿,這個(gè)時(shí)間更是不可忽略。另外祷愉,有些情況下我們并不會(huì)立即用到一個(gè)對(duì)象的所有屬性窗宦,而默認(rèn)情況下初始化時(shí),那些在特定環(huán)境下不被使用的存儲(chǔ)屬性二鳄,也一樣要被初始化和賦值赴涵,也是一種浪費(fèi)。
我們?cè)谑褂?lazy 作為屬性修飾符時(shí)订讼,只能聲明屬性是變量髓窜。另外我們需要顯式地指定屬性類型,并使用一個(gè)可以對(duì)這個(gè)屬性進(jìn)行賦值的語(yǔ)句來(lái)在首次訪問屬性時(shí)運(yùn)行。如果我們多次訪問這個(gè)實(shí)例的str 屬性的話寄纵,可以看到只有一次輸出鳖敷。在首次訪問的時(shí)候才會(huì)調(diào)用
? ? lazy?var?titleLabel:UILabel = {
? ? ? ??let?label =UILabel();
//? ? ? 只在首次訪問輸出
? ? ? ??returnlabel;
? ? }()