From cabdb73e01b26d8bd49e88f0bd4bfec2f6f022fb Mon Sep 17 00:00:00 2001 From: AceVest Date: Sun, 19 Jun 2016 23:44:43 +0800 Subject: [PATCH] closure --- .../Closure.xcplaygroundpage/Contents.swift | 77 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 13902 -> 14532 bytes 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift index 66a43a8..cd5b70d 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift @@ -24,7 +24,7 @@ import UIKit */ -let company = ["Tencent", "Apple", "Facebook", "Google", "Twitter", "Amazon"] +var company = ["Tencent", "Apple", "Facebook", "Google", "Twitter", "Amazon"] var sortedCompany: [String] = [] printLine("Sort") @@ -120,11 +120,80 @@ func makeIncrementer(step:Int) -> () -> Int { return inc } -var closureFuncA = makeIncrementer(1) +// 闭包是引用类型 +let closureFuncA = makeIncrementer(1) print("ClosureFuncA:", closureFuncA()) print("ClosureFuncA:", closureFuncA()) -var closureFuncB = closureFuncA +let closureFuncB = closureFuncA print("ClosureFunnB:", closureFuncB()) -var closureFuncC = makeIncrementer(1) +let closureFuncC = makeIncrementer(1) print("ClosureFuncC:", closureFuncC()) + +// 逃逸&非逃逸闭包 +printLine("Noescaping & Escaping Closesure") +func noescapingClosure(@noescape closure: () -> Void) { + closure() +} + +var closureHandler: Array<() -> Void> = [] +func escapingClosure(closure: () -> Void) { // 此时参数前加@noescape会报错 + closureHandler.append(closure) +} + + +class ClosureClass { + var x = 10 + func doSomethingAboutEscape() { + noescapingClosure() { x = 200 } // 将参数标记为@noescape能在闭包中隐式地引用self + escapingClosure() { self.x = 100 } + } +} + +var closureInstance = ClosureClass() +closureInstance.doSomethingAboutEscape() +print(closureInstance.x) +closureHandler[0]() +print(closureInstance.x) + + +printLine("AutoClosure") +print("Now Company Items:", company) +print("Company Item Count:", company.count) +// autoClosureHanlerA的type是 () -> String 不是 String +let autoClosureHandlerA = { company.removeAtIndex(0) } // an autoclosure lets you delay evaluation +print("Company Item Count:", company.count) +print("No Remove \(autoClosureHandlerA())") +print("Company Item Count:", company.count) + + +// autoclosure parameter +printLine("AutoClosure Parameter") +func autoClosureFuncParameterA(closure: () -> String) { + print("AutoClosureFuncParameterA \(closure())!") +} +autoClosureFuncParameterA({ company.removeAtIndex(0) }) + +func autoClosureFuncParameterB(@autoclosure closure: () -> String) { + print("AutoClosureFuncParameterB \(closure())!") +} +autoClosureFuncParameterB(company.removeAtIndex(0)) + +// @autoclosure 暗含了 noescape 特性 +var autoClosureHanlder: [() -> String] = [] +func autoClosureFuncParameterC(@autoclosure closure: () -> String) { + //因为参数被@autoclosure修饰了,而@autoclosure暗含@noescape特性,因此以下语句会报错 + //autoClosureHanlder.append(closure) +} + +// 如果用了@autoclosure又要用escape特性,则用@autoclosure(escaping)修饰参数 +func autoClosureFuncParameterD(@autoclosure(escaping) closure: () ->String) { + print("Called autoClosureFuncParameterD") + autoClosureHanlder.append(closure) +} +autoClosureFuncParameterD(company.removeAtIndex(0)) +autoClosureFuncParameterD(company.removeAtIndex(0)) + +for handler in autoClosureHanlder { + print("autoClosure Handling \(handler())!") +} diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index 5f08ca2a96df821454713de6a53f5ff0e5314444..1bafc59b124ca6ef98ca7707abd10100e270d426 100644 GIT binary patch delta 7969 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 L-JiSx5LfU&m_9S! delta 7775 zcmaJ_2Ygdi+dt1aH+weC9vw+@lO}1|v@DrrgFxBCT4)NDLZP%EV$He85JXl)nMx@` zHi*dH8$>`vmJAspuZoI*DC;{(X(`|L`sMt7$;~;>e*Wiw&%OJHf1N+wNG5TUXIPRU zb4K%ep*|=Z^+y9y0UCyeqe3(SjYRLD5E_fdqiJY5nt^7b&(LzT0twrn5 zdh|KkfWAaq(GIj5?L!CAA#@gzes0*E-GjxGW=nCDSJM@5_&Wt%uo%m+0>@w-He)At;Uw(F$+!V-h#TQoaAVvAH^t3xbNnjq zggfIdI1_ip-Eeo@7r%~ka1iI>H}GJbkB8wRT#QHK5?xwp6p+(hoZZb?In^Yc$58ImIf3TsGBND4P2<479yZa6}gfXYsjX(mmh z{pf4d8*V7JC1~5U$jBU2Fsftr$h?8sMFoX@*hJUt{_V5-2lKPEDPgV765cO*Q{Rux zXXNBDiKd0YY%P*yY0crwYI8VFDbb<6=rzQbqJGp-in3@NGv3H(384WfcM-}#K^jlp z)Kd}JAT${17NI=!22G%ei%>oqLY>q_llryj-nC6maA;9pZeFl3ORHu7yXOT*b;uq# zG_R;QC)ml=WGae&zCpE79aMyh`*zH1kvE_yuV83);pjzdCcVPVs1SPVfBAWv`Qd4j zt4X7(Rwxo)>zLW0xG1}Sez0j_VfN@UL{VLoUhd>wG%iaUTPg6uTN!${s=onN~_W8v<9t7Yth=Y4z0T!xzVR+Au46RWoR+`Udp@3R~vo7X=IRh7Qaa8p$%}HMY<_Z$uuu?!sbWL4}7~XN06# zTK$+Y)dLCDO9BaFYSyV2NT^$R6ok09jbOaqm$Iw@- z8eh|9zqTd+E0EJY{LDVDJteT&Y}mb4?wHH~(nog?|`Bl*5LEPH59FsDsXaL9GN;(SgWv1zs+pD@a$0F4I<}=qhbZlfqBT48u3jj}d6! zq-{#kE!viPdo&#o?3AB9xO9#?HG;bxefDDwxMh41&w$KjRLkH+c-=HI?l?@9Ui|9dm zh#sbw+3xBqv4$UrV`Ev|5lU+j>|Z=^U@*#8VZEenxKPqCJ(gwEBAA<9oL>}OkC0h! z*35$9qAFN`z7XLv=tl>aLKe+0=d&D$@EPPlkPe~4UKDT;yu@da4@2lsT0oO}MbH@K zOjncfuSY4TqDzHP{8F(-!YDeN7P4Y(H9B?hHoOz@UqXvYAw-Lr|Bmu%P2gP^ADJFU zN0!0_I*NL`cF4{fT48fCOhvjfcps*~2lP!kn!Z&A(^%zZ&@rr13z_X7bp10wMm0-e zHhr6_EA-|;8RD10d{_XVz^AYfN?{Q#q3_TTrBt9}>ATBdF)V?lu#Ao6u!4@GUga!9e?DQ~JCe_#o+mLPvd3_-ola+m-&Lh&oJBPk!8tfjXVQ;Ymhe4XVp_}K3S8~| z;`Y+54I_y+SqdN0Sv{KP7mO$_3~F(d+~5Y>oT*MEKce)R>iBjQ7Jg#2yh=Z2wVYMK z0kNTH<)71VhxzyoeuqEcZl9cj0mVbueXLuT_PvVoh6G0xWe*uf=hAuMspHS}o6eij`Q+kb+gTtQ2eL;&K2rz_Hj+0U&IoOK1gaU<-CI>|iUl zVLM$)m(kD4a2(3O33NHjcYhQ+*BRIf)=x(|_ih*6_Rp}Rr^fkJp5&*bv zw0%4OzxLsQk@nF&bRI?FJ8`YU>kJLzE1Q7_Qba$cd&(UQk2ol#2f}irGc*#9dWnVc zTX@XN6Yt=65x*FRFvS8MOOMc_^cekWF&>A<;|X{oJx)*4GxR&^?b$wGnXRCD2rj+SCZ2c>us{k9ZkFllc%QLYbZp~Ay*yppX) z&w6+jJ^TCygV!={#Ov^SdX8SKKSk-4|79FO1i~tvha(uJvkN}_nobhlY7w?6q zx(8L6O^(h!U>m5d{)KF6boODEwrBW{xQy_t0cm(nysC;?t*F318#cu|aFyxw==9_8 z&BXCd8=%}$q@uVIU!*Zr- zg#yF~U=YA0fK6bBrUA~UVJx}b zShyYT=rM)nl7;_jq4b3Xj0ytjI;zkGEsNQ30)MC#>>2<4@RD^SsocvdNr^q)^duIfQ z7a$>GFH3;L@_4pC3B6NL^`P_Od{bfjBDswCMQm$cqW1-GEh1OQRRP=rJ8r)OiJRr^ zV(0X_44n4xpk!z0CvxXsHS#z4 zhdd&W$rAyR1@H;r7a$-&$`bO7L(F6xM+8U}pc<8?(H;U+XB(~jVAmqN%IEB*=GduY zDW~DI#LDR+j3Yoz0cz7n0@RI=&Qi|EnK(0N;jA2ke!2h+1!yinD*@UG@ajuxa|z{X z*UHlNs9=)Bmc>H{q>dPsms?b2OK|RT$vRoueif48>wcY~67ig`Tq5lSE9q;Mzdzwp zICijE{2cccC)vr1xmsLp}!y;qOw6)jM*T5e_S_a@88AEatj$-IzC4(-s0` zL=;;xMSE&WpdZ)&zlJw}%V7$+0x;%l6H#DKtl`nA-atM#{J$y`awC{Ru>kD_=nzrp z$P`Ycx~h-iC{y_F`3T%trZi4~P6Bj}D0N{6WCj{$z%$d%6MfaqvJBNguP8$ zPF9lDWGz`wc9R>Nn^j~aHR9#e4 zR9jS6lrE|-YAAYD)LE1%>L%(T>LuzU>Lv`;LUED!J@E|jN8;Jyx#Ica<>EEsb>h#(o5Wkh+r&G>$HbS#SHwSw z{}4Zw5Q$b|kc3PUizH5xAaP2PBq@@*k_<_ENjJ%0NueYpnIL&jGFdW35|+%8d@PwG znJ3vMIU%_#c_!6K^-`nMEVWAQ(l}{?)G1Aprb+8b8%P^T8%vu?n@cmKt)y+F?WDQV zV(BF50_iI0e(5>sJ()}>U}EmC4r0cF1|h4#*D4j>x`~os(UVeJ{H#yDGaTyCHid_sQGHhsZuDV`{vDM6`Gnw4&) zPZ?0ADr+h0DASbnlaQBD8mF4C+Ne6Gx}*AAEmq6a3bk6TRqNEex|+JS zx~@81U0>Zw-Co^M-AUa|-9z0=-A5f%4^@v*Q}tN&IQ1lT=zaAE>S^jy^$PVS^;Y$E z^)B@u^*;5_>WAt_>L(hc!5U5@(-<`lO}r*iKJ=WT1-~VpqQeVl9-7x^JCV= z?2I`T^J~m+F@MDT8FN48FI}>(rY=oaPuD=#NY_@^P1i@)PnV_3*5&C2>xy(?-E7?^ z-G1Fc-C^BP-8Z_6x}S9SbWdYZERN-32ger0h9<{Oi(L}CCiZ;nWxY&aSKnOUPTxb{ zOW#M|PoJyL*ALgfr7zKk^n!kleyM)Bex-hmex3ev{RRCk{eSeo=zr7yq5so>3=)IP zpfIQmdV|qmHdqaILu-gG|@EOw7~SKsnk?v z`q`Xhu3@fau47I!H!(LiXP8@=Ls{m0^APh;^DuLX`5kk}ESRU7KQ_-X&oeJDe`@~B zyu!T7yvDrF{JD9X`GEPP`6u&z^HU45U<+pvTQrs!ORU9UF$6G(OZnbW=?zHZG_Cot?`x5&a`#SsQ_Al&T z+IQLa*!S5F*bmu{*l*Y$IAR?>M=eJaM>9tYM@vU*M_WgGM@L5=M?XiFBinJ*an^C( zanW%pu6bOixGr&Bum2Vc7Ebq>0IMn@BG5K$+^XO(0SN- z)OpDuht>e}wwm6V#)AgNJO6H}aeKE&Miq2fvFy z${*)X^55{^@@M(;{5Aep{vVIXBk{;Q3XjU8@mM_$PlCtkN%D9+$)1{?S3Ipf-8{WL zeLY#89M3?{8=id6XwMi=iHCZ&cn*3_c}{!Ic+PsxdoFr@^xXFR;tAdH{OMWKps%*^q2b zwkA8009kv8}hC9ZT0Q&?e^{U9q=9Uo%Ege{ouRf`^)!_?};DziC^j0_;r50 z-{iOWYy127^ZYaXbN!3_YyF%3+x$EId;I(T$NeY$r~POA=lmD^*Zp_>&jQMTAz%tv z0=9r7zz328fk0}YMxa)pVW3SQGw^yKFEBVTBv26OF+A{Apd>&8V*}#@69dx&a{`M3 zYXh4D+X6cSdjk6d#{(w=rvqmK=K>c3*8{%