From 218973aaa1251ea411d896fe66a2f1db6e881f53 Mon Sep 17 00:00:00 2001 From: chenyungui Date: Mon, 31 Oct 2016 18:50:11 +0800 Subject: [PATCH] migrate to Swift3 and Xcode 8.1 --- .../UserInterfaceState.xcuserstate | Bin 7569 -> 8107 bytes .../UserInterfaceState.xcuserstate | Bin 11034 -> 11329 bytes .../UserInterfaceState.xcuserstate | Bin 12009 -> 12811 bytes .../UserInterfaceState.xcuserstate | Bin 9785 -> 10314 bytes .../Sources/MetalView.swift | 24 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 6823 -> 10479 bytes .../Sources/MetalView.swift | 20 +++++++-------- .../UserInterfaceState.xcuserstate | Bin 0 -> 9650 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 8605 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 9019 bytes 10 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 ch15/chapter15.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch17/chapter17.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch18/chapter18.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate index e8bc402623c4ce1c1cb2abb8d614462efa116515..af2eb947414bda79300dfa52be0b0fe2a7ca2cdd 100644 GIT binary patch delta 4909 zcmaJ^2UrwW*FNWNXLfdHc4u~HlW0&BYb@9>M#UB-phm%tt|+S#5eQ&GBzuf4##qRz z*ds`=_ugV}F~-=9U1R)=e(Cj#`OJTJ2^jMH&&NIwb7$^7bIy6+_nvd7pw-&8b6mPR z>~4XlHhx~vzJ-4jq(cT|!kdr<*^mRHVGO(l@4{S|2aBNyrb985!Wvi$8(|adfSs@x z4!}`337^1ca2c+^O}GUQ;VXCqkKtQHWT-HRVK?lK1272(;vn?mNKC^~n2s5kh2t<6-@>Ul4d21(_%6PW z0h|ldun?ExGAzbbxEeR$4%~^m@E{(-!*~+U;3d3_SMWC8!H4)2KElWN1pmPQ;#2&S z0YheDelxQ%J99IQdDx4rCacF9vlgrsYsWgX?(B8egY{$m*#I__rLY_}nvG#&**KQV z#|HVh7j-c9C6Tm)R9|m3_{x zvFq#xyUA{`+r4T8F5@e@jg%Nr*<@W$@&=Z$r!IG1UgM_q!<#kFuOH4wjT+StkB({_ z*s7ZmJ(XtChvcDpwzBI2S@wNK%YBZAJeUCafuoMN@MZ*5lcFz!ABay) zgtuW5pB@iWVH&&x(*q5i-KsXD77|jV1eah2yvLW#gjp~f=0E|w4{?FEVoytBs!dI) z7S#(Z5?j0s^C4;l6v6^nNOkBXYDl&VumqNJ(`7vT<^5w*eCauPiTn`^YG#|X!x!ihX(3%d4U3(+Z;tr2)t6yz$ROSzFlT!THt}LQ5)C=ySPo0OR&{I!7|By2fsn&O86drfFI!}_!)kIU#SCi zq)zlIb*3&9yAu8bzrz#G^)h%0f6{9dN4+@3bt#Dk^5_l=>*|D|9ULVnpcO^5Q9N~} zZq&U5C6u8iI_Y)l!R4I5!zi>)@Fyx)&Q9!`$McsLTU?awAUNe76goeJZukJ`*cfaFeEwKH-KNWd}&-}V|-j0gD9#j zrB3*2uWkvwdd3%HCx|Y4)&*m^2)iY89i5XrB+d6M-xb&;m~mN3ahxuUr{q92N%04< z%KwWtd>wm1WC`}bo|u4%G?Y@vN5e|6H}=84*pG(OD9WYrzO)yL}<3$&0zEe-6Z1>tU44^XauFw8#J;6YC;^2 zfEt|CdX&bimN#%-${&#lQOhf&h1ocoD;9Goy$Hup26?@b%y(o(2(dZ7QQ2jQj>r6B z%)<$kNuz08xpzOl4US?YoJem{RxwV($&^hwTt#yX)%+EiMa1M01pmtIX5g$!cC&E~ zjiIrW_$)zglNqupqhlVfsw|jz<6Wbm+{~DBSemcMaS!x&y;a)dD{ov&zda zV@wZ@BBrB-Ma)2pxY&wJ9zU}%f#bo#XmJs<(h~Ciy<>$+DU+C!$IE0`NlU2#A268@ zmXh~%-U{=|iX1 zXSk;ZMXU}LKbxq}8U!bnQQe}D`*I1gDAu&XNi!;W<|LZ6tRz#UT)`?cq8d_gLKkLHc{>~|jXI*I(t>)Nm);s+XF_|%cCzkbOy(%s5 z&HB(w3w3)WhR@z3}OW7!v&N5ggdy`kQ9ki2n(MdWTs%Wj%8BOvqzlis|fiy0p zf94O~i^QJgK8Z~Uax|HC7qO|dhpTF%y>64T?#kX}GlP7P3WbF?~b_=pY>`VN2OEsL7VoVLHO)dz8B> zwE6?_t``#5u#Lew{m=f(HnGj2{(GEGaEk=;Mzq_1g16tHM=IKHIZ(UUo}fN<)2Sl1 zmpSj7&p!|Vt<%8s$)>;yYWpU@fll+My;bdJu`g;nfhewMAt&ah9} zS@s!6@*+pDCtae;bcL?+abn<}>kr*M_C?^X+wK1ef9D?$b}syCK_#=gtReqyXu_JY zB$myH&E{VP0sdW3$Prk~(_Y6m@Km<2ZTzc%$I14w)9hPaBb`?_QMXjLOLty(U3W`& zM|V&6Soe$WPrXTR)vNmI`X>5j`WE_@`d0eZ`nLLZ`VRU;eQ$kVzrMddNk2$GSU*Ic zq93Nu(ofL`^hflU4F-c|Xl&?Wh&A*!q#8yVMj0{;ZyK@RH-ZUbQ4ye3m(ud6t8g&n?$2H!ZgoK{OgJH&5>5-(gd4&w;f`=mxGy{q9tw|yU#&W8RjWVB z+Rd6~9cP_oU2H9}mReU?*I3tCw_A5wcU$*b_gfEGuZbwy#TH_W7%RRe_7MAv!^Jdl zqBu#MB2E*hi!;Qz;$m^B_<>j?t`IkgTf}YR4)KV1Ogtf;5-*Ea#cSdX@qzfG__O${ z_#az!TSHq5TL)VwTW4FW-`3OC*EY~L%r?O`$@ZRYwynSxu&uG}v>mh^wjH${x1F?| zvt6)VvR$!#Zo6)~Z~Mb;vdi|W_FDEj_Imc0><#VF_LuFi*xT4+?CtG??fLfQ_TBcw z_9OOV_Ve~j_AB;l_8azF_8;s|B#@Y-myD8A(xm647o=*EKSHW0)smV?U8EjTe`&as zCZ$W6(r9U{lq=;)Q>0l^p;RiZm-a~er32Do>8NyEx+eWgdMJG*J(hlxo=E?dfwvdE ztjX2nNV&FLSFSI&l-tNLa(lV694p7kUFAOVV0o0BCFjUvH7)lt<^ z&(X*c1gF>?P%*raEx&*bd)-_I<`A@I(9quI`%sbI6iTF>iEoY-f_`!*>Tlz z&GEexoDOGmr_VXrS>W`~bsJmdN0sBsN#$eZigH7_rQA`z zRQ{!Wr94)iswP!YJ?isn6}7rrLyc5xtIgH6YP{M*O;CHO{naFOkUCh+R!NMC`Ox=!7oZc?|X+tjn_UG=F;a8-A;bhUSNa&>max_Y{Lx%#;L{anLb zsjiW(bXTS;%eC0G%C+9L(Y4vN!?nw`$F~b;r58y1To3xcj@4 z+=JYM-9y|dZoj+Kz0G~Y{iXXG_ph2>6E(XgYfeqos%qg{b*+XLsnymRYcFe^wb!(G zt-IDkOVErR2z> zD1wx*77C=TtRg}|WS7-t7+FMyO;pqY85~4ZP|=y2ma_Q&C%+^&_ndp~ckcVXbI+!f z(oPEu(|hz_X=GFQu=J_Kz+f_xWRe^*j*KUHB%e$mg`}8FBLOmlyh`Sh*T_mzPF9iC zWDN?V82L2{HFBge^Ua*kXkpObIMzsYU#Be_R@2M&0s2TwqK zXaLdB5E?-YG=?V79O9u3w1qCvH2^8l4N_qs41&Qh1ct&e7!D&~B#edUVH}KyJjjO$ z@B$RWG?)Q%;5AqPi(oOVfR(TYs^AUS1aHAMsD=aZ9vp;2a2QU&NjL?k;S)Fum*6wF z3}3^ya0`BbU*R|SFXgC}s#K#cI-(wZg4U<8G=X-YooP3kN}r`^v=8l12hyQ*B+aAw zbOL>W7SKZKr<3V4I)l!ki|Asygf6A!bQN7qtLb*SgT6y|(s$`Dx|{Byd+9#9pB@PQ z2whDZFeccZ&N3xqTyQV_BQmPExJB!Bi5=pjTemNXk1lTAE+HX4I=O9!;7QZmr~iUY z@hObNzhYdbY;-Ry^cDI&dH$X`K7W2eVQ?LD}T0usWTx@{R6~srzVnb}ivWt@&2KvQxoAoRS zzfO~Oq&<0o6b$d1p6bi?`||TV1yd^6Oj2DaKbiEWP*Yf_CKwabEkF8^ASGn_$iC@) ziu|6eao+9)1)eFDq=a-JNws?*c`;MgY8*O*Js$2>N$}DAW|EgkYz3J`X5*9Ctb)uY zbFdjUXZfb6i5YdM=8;7tb}gAtUMCAkDOpH@7>_NmCAPu@Y`vB&CQZmv_E}EKuni_- zNA~HAUBVB_6+Y(46Fhl2-kdbQcYI;cp-l|lQX4)v>PqqkQA4B(+lI(mY{yQmT#F2l zjpWVn6WE09Lu4~{z_=mVV>}c5-hzbIb+ERQ?P2iSNHr#6Qh2b94H7Y~-$P%a&Ur7{ z|6rQ~*a>6m42Q^J61!$i4cOvhMz{pVz5L=f?UUo9liIZ|DXDXOpM3Zr!bjNkVT6B> z6Az%C#1xFHTk#3`G;FBGq!2la-5wgwlZ#=)1?(QG!5kMRU!ZQ;7vxIVT0_3Cum{GS zuHodrNOmQ;O0JP_F%_T2XCD&q2D$kdYf{K9bYaghYbJE7VNG4=pUBP!{@L+ zrf(okKqHMwDoF)5L_j1&F@9t)DMzq(0E4&)SB8&Y4huKcn^lyX>n#YYGPs#r(s<~& z8fj+~c)jvH6o*wpGK16!hcg%@;aVhlGN3zY6N0C31Ul*#_Jlqpb{#wo&%m>g27iTK z&>Kf$CXPZ6W??qwtb@MrH|R$$kPDCw8R*5)n1|ijdny()bl0UfpUi|DqE^8u@IV%1 zV=j(CAC9d8FN|jAGX|f>aqLvaGZ+VK)8bR-?V9Tu9A;x;QrnWj#q2vw%uk^J3W)@M zD1wPF2`0l7k{ax4=`T*i2{;AwF(SC!lGqJONSjKS4go-X0SnR3vVoZ}i&eG@EajJn zrsa6^{JzmXZ^3{xCe6tVY6KS46c2a>UJdpV8kj0zZZJ(~)cO9x>hMBL3j5uU1*J7p zMd7K3iu(kXFoa8C87zmg;8wxSO~T1Yf+vie9<>{k!zxytQU_+F=4Tg;XFz)AXM4ic zumV<-r2pSkyD|h7L9ZBZhDwse2F-)N*qcjh*>>xo3^u^BU@M2a$uyi)>-{Ed9?&;^ zK>ywq@MgF&vce8q!jJcDoE|K7xB^MZNe|==+hG@pt%4o!4(xEbG(_d9=?JmjPuo4YUmv1avhtF zz=z>&j>0jh|2}+xv+*T-8Rt~7@|g<9Nn=KW2z-T!BQE%qvm|hav|00zivNW3VTPZ> zxgnCu{FrEz9{G8N`QyA#`^K^27)BsN-Cm!=mvw~%uHgLpg#^A~w;22juHx%h`k;uw zb@=Wvz3+gV$ke$YTpNlXD-CcPetyjL9k|O*YhjJ&ghz`A+=Jh1i|c(zlu%j+iJEZn zeMppNkf?LQn$b?3dXfo}HYcPZre-c`)uIjY+e(-BNo!>zHw%~nfCnn_2qTc3`i9-2k7X%6+`M%;vN;%0mcx2&bP zbPV;;vGjRH+P85lZo_wRPYrRm>vID|Bs;`PVKK(m0-M7A6Fbs}Pq%~y!emazsUeD3 z{or<_GwJNGfh`WvmvH+-!z*-tSUZ2Nq4agSfHa{CaRp z)8)7;L|5Q$j0rb=eLds7>HY#=UhX3`tG4Z*#vii~Ddt z9>DkTARfZQ>*+>zoi(AG>05LQeVe6!gr%K~NAVcGj~}pc%n-k)AUAk0;!fZYJv<=Y z@9}#Ph(IDqBhs8TfgMQ-oPi5)6>h?>6ev#x)_FUr!g_C=wcF|J*z;L)T}X@QBszr_ z(-Qg`olh6gg{;M1LRn^XCEY|%m}FCm$zv)pEi>&f?Kd4X9X1^`eQY{!x?;L+x@o!_ zFmq%hj7k(G1Xcl=<678Z>RKzGTPK*~@ih%^Ny_hH_ zi=D(&@i}pzI9MDiW{Ms$Tl9*P#o6LAu}oYkt`gUX6=IdRR$MP`6!(b-#Dn5t@u>K| z_@VfB@gL#|@s#+r_`6lIHnO&`_OOn&PPNXqF0?MTF140fS6WwDk6Aylp0%E{UbKE@ z{oMMs^_KOn^;he?fb|cFlPr=bNs?VkmY$P*Qh`(?O_HWaFG-7~rP6X~g;XxBmO@gc zv`yMBy(7IV?UwdR`=$4!L(&Q9qV%)PYKyg{+WOf>+X`*dY}0LMn_-(}n`e97R%#2{ z7TcEEw%N|xuG*dU2zx_&Gkc1?zujZ^+ZWga3+;>SOYF<+W%lFtPwkiNm+fEJuh_q~ z-?HCxP>0#UI|PT~NN}`wWH>yIY=_s8>+m}!Iwm`&I%YXa9p#R7jt!1Yj?GTR8RblH zws-b&W;g@RSF z*&}DmUO89x$H4CzaF6 zMdh0EopMtN+){p4?kc}3_f$?*RZVrNh8m;Bs!i4AY74cMnxuA7Q`GKi54E2ZkRK`epqK{fd55 z|3UvzzoY-6|7Hk=WY`VaPz{&S&}e4F8!e3lqm9wY=whT8-HjebPou9f$QWgeHzpVb zMv*bem}0zalp3pyEyh-(+Sp<2GZucJdNA64RFWpybnw4-*QuCrmYJcm#-QWHX!$mr^ diff --git a/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate index 19dcdfe516a0737f8127c91e5ebb9a8182a826a7..910515d15ec43c7dbee43163d14eb82259a57e37 100644 GIT binary patch delta 6688 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 delta 6405 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 delta 7054 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 diff --git a/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate index e170f36fd22a2bd502161415693838c4a531f051..2682c7cd75ad6618893d75d0e61ca6fdd36616da 100644 GIT binary patch delta 5997 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 delta 5647 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 Dkr8w@ diff --git a/ch14/chapter14.playground/Sources/MetalView.swift b/ch14/chapter14.playground/Sources/MetalView.swift index 2a6bdcb..e41a720 100755 --- a/ch14/chapter14.playground/Sources/MetalView.swift +++ b/ch14/chapter14.playground/Sources/MetalView.swift @@ -10,7 +10,7 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(_ event: NSEvent) { + override public func mouseDown(with event: NSEvent) { pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale @@ -28,8 +28,8 @@ public class MetalView: MTKView, NSWindowDelegate { override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) @@ -48,23 +48,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + memcpy(bufferPointer, &pos, MemoryLayout.size) } func registerShaders() { - queue = device!.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device!.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) - mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) + mouseBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } } diff --git a/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate index ca9289d2a2ae12ec9a3d1a16c71c3ff7e1f4ca8f..1ada104005854851074cfee0ecbe5145713958d0 100644 GIT binary patch literal 10479 zcmd5?33yXg_PWBKH0capfL+NNN%0~sL5RF6Q(F9b4CZc-8qj{(S z%|||T6QUXHKFEAa2|D!dx6$9Lm<@CLjI@5c|~1Nb3)5I>9$;luck_%Zw>K8c^lFW?vP zYxs5i7yJf3gWtht@w@l~d=7ttzsBDYB~cL@u@eVzk|g3HZsH-Sq(4a~86=YoA=zXo z8Ae8sF(j81kjbQ+%p!A1J>khbauo@XFli-iWI4H!tRlCQyU9J|Ub30&Aor7lx-xEi{Stp{eu= znn5#Z7R{ko(h+nd&83s+6k1HD(h^!ut7tW?p$&9C_0a$g(J%$tPOqcO=}mMsT|+n0 zd+8?HK|ASYx`l3~57GlOQv5BAjV~buQX&;nBQ4U;EG|u7z_*5~*zYc!m8aA-dPAX3 zl!!DyfOaAd=|BQs!^j#gWzewU!v_x^oSl}PJvc9INOpc^T2B7p{ItUS{DS<>LaE!41zC{|*^vV|Q4&ZY0c0Qt1t>wa z9l4PQB{K;uCjV8=I3qJZ*U4pq%`%) z9NSP0H?ZfK;_mKaXZU>!Tlk`SrlxP6kBPy#8F^k^nEC6^bFATPF)7LdfyP>IuqagS z3;AjrnLyU=HE-?M9!pUpW}x9H^*)q|vd|zj7!5($Xeb&6iJ$>3aG(P{7{GWR%3%f^ zfkvWHXf*1Ba>2w*I1o<43-A#$<(H5-o1Iix?+XWlc|qP=!*T5I()oeK#ok4}1}}SD z!2w1jK8G(pPfHOJX&M%dTr3%3d^OIe5um;3m|BJUVq@whmv z#<3{iL%s(8&u|c=6Z!l2P&E^QZJX?^8KQyp&6(g z%wPd4*uV}Ba6%Hezzv>Vr~*}@s)(&-GdtCwxyXxZAsOkNL}kqEsc51pfqK5Cl$osF8?3M4JYBRULQD^Z8A_(}%|SlIzIekd z$cKbm5cCpvGY2XcqrdofX-jPrV_4OLH^&L&k+U24uB+2U|LkFM!4rFI8_)ZFEey

yUlzO*jT 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 HdG`MS9U1#3 delta 4351 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.size, options: []) } func update() { timer += 0.01 let bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) } public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) commandEncoder.setTexture(texture, at: 1) diff --git a/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..294c4cbc6ce790c17efac33120cdbecd31b849a4 GIT binary patch literal 9650 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 YTP3&Z?r&5OA^cxvE&n(0yVaxr120?|KL7v# literal 0 HcmV?d00001 diff --git a/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..49c33bc9984b77dde5a3c8f984cd9fdb1a8827cc GIT binary patch literal 8605 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 L!T+Jpn3MkjbqTp) literal 0 HcmV?d00001 diff --git a/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate b/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/chenyungui.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4ce4aba0f6f30760cc0a1d7af752644ed5d5361f GIT binary patch literal 9019 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 WDRF~>a|0qo`OWy0-=TlwGXDo|BngiI literal 0 HcmV?d00001