From 8cce995887e8552fd42cb1e2cfb5dcf092716bff Mon Sep 17 00:00:00 2001 From: AceVest Date: Mon, 13 Mar 2017 23:54:04 +0800 Subject: [PATCH] ... --- .../Methods.xcplaygroundpage/Contents.swift | 179 ++++++++++++++++++ .../Contents.swift | 84 +++++++- .../AcePlay.playground/contents.xcplayground | 1 + .../UserInterfaceState.xcuserstate | Bin 21297 -> 22111 bytes 4 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift diff --git a/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..745b406 --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/Methods.xcplaygroundpage/Contents.swift @@ -0,0 +1,179 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, playground" + +//: [Next](@next) + +class Counter { + var count = 0 + + func increment() { + count += 1 + } + + func increment(by amount: Int) { + count += amount + } + + func reset() { + count = 0 + } +} + +var counter = Counter() + +counter.increment() +print(counter.count) +counter.increment(by: 100) +print(counter.count) +counter.reset() +print(counter.count) + +struct Point { + var x = 0.0, y = 0.0 + // 结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改,如果要修改将关键字mutating 放到方法的func关键字之前 + mutating func move(x deltaX: Double, y deltaY: Double) { + self.x += deltaX + self.y += deltaY + } + + // 可变方法能够赋给隐含属性self一个全新的实例 + mutating func moveTo(x deltaX: Double, y deltaY: Double) { + self = Point(x: deltaX, y: deltaY) + } + var description: String { + get { + return "Point(\(x), \(y))" + } + } +} + + +var point = Point() +print(point.description) +point.move(x: 1, y: 7) +print(point.description) +point.move(x: 8, y: 4) +print(point.description) +point.moveTo(x: 9, y: 9) +print(point.description) + + +// 枚举的可变方法可以把self设置为同一枚举类型中不同的成员 +enum TriStateSwitch: String { + case Off + case Low + case High + + mutating func next() { + switch self { + case .Off: + self = .Low + case .Low: + self = .High + case .High: + self = .Off + } + } + + var description: String { + return "Current State: \(self.rawValue)" + } +} + +var ovenLight = TriStateSwitch.High +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) +ovenLight.next() +print(ovenLight.description) + +// 类型方法 +class SomeClass { + // static & class 加在func前都是定义类型方法的关键字 + // 不同的是static的不能被子类重写该方法 + // 而class则可以 + static func descV1() -> String { + return "BaseDescV1" + } + class func descV2() -> String { + return "BaseDescV2" + } +} + +class SomeDerivedClass: SomeClass { + /* + 取消注释会编译错误 + override static func descV1() -> String { + return "BaseDescV1" + } + */ + override class func descV2() -> String { + return "DerivedDescV2" + } +} + +print(SomeClass.descV1()) +print(SomeClass.descV2()) +print(SomeDerivedClass.descV1()) +print(SomeDerivedClass.descV2()) + + +class LevelTracker { + static var highestUnlockedLevel = 1 + var currentLevel = 1 + + static func unlock(_ level: Int) { + if level > highestUnlockedLevel { + highestUnlockedLevel = level + } + } + + static func isUnlocked(_ level: Int) -> Bool { + return level <= highestUnlockedLevel + } + + @discardableResult // 可以忽略返回值,不会产生警告 + func advance(to level: Int) -> Bool { + if LevelTracker.isUnlocked(level) { + currentLevel = level + return true + } else { + return false + } + } +} + +class Player { + var tracker = LevelTracker() + let playerName: String + + init(name: String) { + self.playerName = name + } + + func complete(level: Int) { + LevelTracker.unlock(level) + tracker.advance(to: level) + } +} + + +var player = Player(name: "Ace") +player.complete(level: 1) +player.complete(level: 2) +if player.tracker.advance(to: 3) { + print("player is now on level 3") +} else { + print("level 3 has not yet been unlocked") +} +player.complete(level: 3) +if player.tracker.advance(to: 3) { + print("- player is now on level 3") +} else { + print("- level 3 has not yet been unlocked") +} diff --git a/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift index d343e4d..be3145e 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Properties.xcplaygroundpage/Contents.swift @@ -51,7 +51,6 @@ print("the DataImporter instance for the importer property has not yet been crea dataManager.importer - printLine("Computed Properties") struct Point { @@ -67,6 +66,7 @@ struct Rect { var origin = Point() var size = Size() + // 必须使用 var 关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的 var center: Point { get { var p = Point() @@ -81,7 +81,7 @@ struct Rect { } /* - //set 有更简洁的写法,set重命名参数的话默认参数名为newValue + //set 有更简洁的写法,set重命名参数的话默认参数名为newValue set { origin.x = newValue.x - size.width/2 @@ -119,3 +119,83 @@ class Cuboid { let fourByFiveByTwo = Cuboid(width:4.0, height:5.0, depth:2.0) print(fourByFiveByTwo.volume) + + +// 属性观察器 +class StepCounter +{ + var totalSteps: Int = 0 { + // 默认的分别是newValue & oldValue + willSet(newValue) { + print("About to set totalSteps to \(newValue)") + } + + didSet { + if totalSteps > oldValue { + print("Added \(totalSteps-oldValue) steps") + } + } + } + + var serialNumber: String = "0000-00000-0000000-000" { + // 不想用newValue & oldValue 可以命名为别的方法 + willSet(newSerialNumber) { + print("New serial number \(newSerialNumber)") + } + + didSet(oldSerialNumber) { + print("Old serial number \(oldSerialNumber)") + } + } +} + + +let stepCounter = StepCounter() + +stepCounter.totalSteps = 100 +stepCounter.totalSteps = 300 +stepCounter.totalSteps = 657 +stepCounter.totalSteps = 257 +stepCounter.serialNumber = "0010-23873-83F123A-ECA" +stepCounter.serialNumber = "10A0-8376C-247232E-EST" + + +// 类型属性 +struct SomeStructure { + static var storedType = "Structure" + static var computedType: Int { + return 1; + } +} + +enum SomeEnumeration { + static var v: String = "ComputedEnumeration" + static var storedType = "Enumeration" + static var computedType: String { + get { + return "get" + v + } + + set(v) { + self.v = v + } + } +} + +class SomeClass { + static var storedType = "Class" + static var computedType: String { + return "ComputedClass" + } +} + +print(SomeStructure.storedType) +print(SomeEnumeration.storedType) +print(SomeClass.storedType) + +print(SomeStructure.computedType) +print(SomeEnumeration.computedType) +SomeEnumeration.computedType = "ComputedEnumerationV2" +print(SomeEnumeration.computedType) +print(SomeClass.computedType) + diff --git a/learn/AcePlay/AcePlay.playground/contents.xcplayground b/learn/AcePlay/AcePlay.playground/contents.xcplayground index a6a057a..52e276f 100644 --- a/learn/AcePlay/AcePlay.playground/contents.xcplayground +++ b/learn/AcePlay/AcePlay.playground/contents.xcplayground @@ -9,5 +9,6 @@ + \ No newline at end of file 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 4a9ccd94eec012a448adcb0d43fe1d392dd1d5bc..5d871e6e33c3a54256d6fa30308f8be2d4ec59ea 100644 GIT binary patch delta 11285 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 G^ZyUb#(y6G delta 10849 zcmaiZd0bOh(Ds>|b8iS?2_cX@tO<)ONw`2FM1dskxZ#Q-qC`bD1>CDS*L~k^?dA&N zZmq4gT3fZ+R%>guF4d~F?$xSww`$$KUx+Bazqjuf{vgbpXU@z#GiT1doZASWu7>%c zf|1Oq1`W$_YcA{NqH~I$cML(jS&_Q$<{en)Qljtn^16@W}&~0=F-9`7% zKi~r*@C7mWfjgf5COQ0XM<@H{5~;@ED%Kb9g~flz_sN59LSsQ^AysQc@9ABo#$9qY|h@ z%0#778B`Y4hH6W-qqHj@6;(~uP$Q_3)H~F8Y7#Y>noG^2=2Hu( zh13VsGOC_hMQxxyp*BZfSxAoVkKh&oIirA|<%sNbn`)J5tVb&L9k zdPF@IAOQ#{UP*O#Zxeha_*(FdV2|K?!9Kx{f}aG31-}T63w{-x5}X$NAvhIi5ncz7FOkoBKu^9Vd6;@*n)?ytF!{ImrM`9y3VKYv_EKbE~ zI2~JXE8H5l!EJFn+#Ywpxws?liwoSiA1=h@xB^$=VR!;|<2iUPo`>h-1$ZIm@w<2t zUWx1RD!dwhj<@13@HYHC-iP<&AMgo$690xz;j8!>{tI8nH}FmTH-3tr;pg}Ten}%5 zXo?olL9~<(re$;p9ZJh-1#O^X=vX?APNyxj+e$a5+t6+4c658XH=R!pp-bqYbSXWK zeupOXWO@ocm7Ye=qj~yW`UCnydJVmnUPo`Ex6@zJJLs?Iuj!riE_ye8g#ML2L7%42 z(C6s$^kw=A{TF?mzD3`r@6!($!~jDv0tPcQ!!S}Nn2|BzOav2YWTKd4#>ki$Gt+`; z$z(CvOfJ)r>BMwq`Z5JfKcD3P>vIP->7j_O!6vSe^kO=VRW2zZe^i79pn<3u zxzHe@AzGp%VI-VHkVq0mqKTduHlQJ>1Pw*eC>Q0T3RH=Pq2VZ+#1JQ`Au3`fX2OwG zWE1&>s0dpq32y6fI$VQ_MwHb!Tmwc7&aQIliwY&7uieb8EOr&<)f80}7gZJKmlchv z98uG)%H`s7eA@AKKF#?1LcLq!iLn7c*wqkNV*~_EL56z7p^0b`noMFz9Em5*>d{m* z4NXTgNCHVEImAxbUL9P6YI>BoMiojzJUJUyR?_fiqf1Rk+E?4e zqxoo&XP*UVA>z@yB#|VMWMZsGdX$SkK+(iR%p}DVF+VPNREm!T9c@T(9Wt*V0Y?#w zQqd~3x=<3_F)w#SP0@fdm!o80O-W@%QPr50Xcbz+`-|j3>(B;ds732ZS}od0(h18a zg(!_^Gul#zK1H7q3u!^J8$;iUwj*gB`T}huR?@rr)w5JZO zL6%0$w`kv6nEmJn(voBm+nbQ1vZ^~H&&O-wXLP9FYoD{Ls*1*}L_ec6WRXCl(Ie=X z$LpiSQHydtC0Zy6inmu*R9BX{T9uU5xEeTaT>Tq5?OA<_w5mmCNNd9KX@SXE=p4G> z5uYb*YSBf~mayG&i%KdQL4Ts_NV*bTMc2?@q#bEbI;=!DP%iqLcs8seHhx85Q8#oS znQPGl(vbu-0w1B5$gl=IMo-Yc=qY-Jo}(9}6X{I4kgg<;bR*r@00ICC1Rww!7}A6E zBt^tUT%?i=BP`$BcZ(TUKiV(7Eu9Ep}DZ zlng3yRdsJ$QS2H`Tx1X#oZq>sa+s^Cro>e(p&J;5EXd}S{$YYT$l>MwksV%HaiCnt zBqhX52KUS!=;~ZnG$z>n()&3E?T{GSLkGx(j(v(N2aYIrRn&Cv+M#z%Nx7@Krl@=v zDI?_s@ylX|^0)jMO&91|C<%7-=;nB}xI^W@B2T^7K^`v&&YzWeG_)BE zMCMv3Ce6_7z__6>0#FH{&D<|k}2YKiSqtFWIh*ppZ1Q9p! z9zF1ZCnx1(#H-^6mcUZJK;8_)GGyTksi1thJ9v+xI;gY$$Z?~+C2y?VF^myjN= zkoU<4#6&(MHonj~j$ap~9MYucZo{1h4)2rYWN`zB%e)*u^mzOaS@MRzLk(mt{XfZi z>FE-(!qX3h5+^@D$;nqrGs51~_{)ZRUeT}zB|_#}%9qsh2c!{FDu9w8LoF3ZR@YKN zWQ}(M6jLE+OC1$T$;n!>;q?TdRFt;qX-?^=FtU!UC$`?Nr)yN!sH}#A=M_~{G!^p} zCYFjL8_CDS#%~CTbW=%GGBT`K@tRu7Or^XnNTV#CBJj*8%1S;ZtT&8IkB2s@1^J9@ zedA#^<#=m1C)J8it$(LluN~$-NPxT>Rkt5_NVfovNC|RK-D9=^q8d&2hetkRQzfy#|8&gq4 z4MB$0)BtKARZO|4LDXRKHQ7mak=^7QvS&3_LJg%#k)A3?da{@NNPZ$Fa@cb-E0oAQ z2_8MHsG`_a+_uJ5UhTQD^lR&I_9&??8Bpfx>Ka&6C<*jjG+w#jSx_j6XzOtD73y$a zqwet9k5SYZB(0@JlW%LOvE(~q^CEi`m5p#!XE&H`ba?_rJmujg-`7$c*+Edt;!Ns4K7A;!kp^ zu`T{WTUJunse~KUO>&uBCD-5d#%=1}TfK3gdO)s_KZ%X^(?% z7F#BJBV`+;j|wHld~I9@{!F;4iPGAjd{QVW;cH{t^Vj3Un*-@|CgLCfdGUt*}rs{FQSGoxQT6##K>Mom4%lWRRD1K_S{wi~I>iviYk~ zDa>jPwh@*Ok3Onko2G7@*PNtKlGkvychYO4|L5EhOcqS>%pDG-90WH^9+sc4*Sc$w z;S-5WFh?*~Fi$XF5FuD7;05mr775-HLt?L3N#1vRwTdQG2EL*4JCBxM9#hdocA!C~i5=F&$|0{6 zU7@7ZTM)^SO$y?eR~zmrh$iCSyy8et$u+Tc)+>(o)UcK)xnH-UNKpyCR;KgqJn}-t~$T8e3{uysC-zAFnp)f3Mr8Uahea zdnR1#`f<>Lm^f%j*v4lZ{-7z+8inILR-&;U8*mJc zw!ttQQ2}qBVIB4au(%NICO%p3S&3da9xAa(Pjx%s3w&4~WwBw*X z2OT)b<)Gs#oQ1QI9+cR@K_?D66O+eOmj)|~_{}LgYbV_O|Bj{yC~+^O$N3!OdBEK~ zesm`+FJzGS{f+3wYRz{Bw< zuV0=V2foU(H^tV5ERV+7sNbv5`ZNtKDtp(^Wy|NQmNc3oc&f(~hbQ7mcru>CK>-K- zI4IYi7HzX94?=Da9|EJG5lgVmL2v1M5dfo`6 zrKNZtUSI7(W7-!PR?#%g&_ddW7I83@gJ~R0=U@g0Ggr}K+OM%6W^pjPX+ONj|8A9A zm2{ZL&;KkIIvkXAB+}E-9L)9jInU$ge8Tbx&12Yj+W23orcI!vQ;?ocwv;R+q=^Rkf4y31Baqyl8{k{kN0bzM(My$I7-PMEs&trhjdqdPmO^J%i z-Zj{e^6=r|#sv1Ei#(S8v&!iKprnhDo*u-(5|1BCiHXCojIjKj3`4&%x*8c))8!Bh zQtz7|4pxxfq?h;Q&uY2`l=Mh?6w=dUIH>g)Sjj=XCze%&?QO3tcD1T3E3Q6@#PoQ2 z0`2bIF)yjQrmCc3Fb8$~n9Rc}j-FU334C)OZBVYHIeHR5z?Q^Lr)MEU9X*4d$-x>9 z*45Fo={X#1;9%2RvzT7!J>l2BdgPQhxw6pjdv)szC29QpBn|&rgsSm1BK;A)!jqx@ zYzn%Tu4^o@jU0UZro?`4p|Y;0H+u?n1HF;{nBGKx!oepTZ06uo4nE^x%PRU)`ZJ`b z9?)Ak_?&~S#6H{aLJH4$I)iudrh?R}ew|MrT%S|3PPhy1fqUV6+!s&6AK^9l3%nigz+dBC_#3!Y_qi33m#23-<`W6@D+=FZ@GzUU*S>S@@^$n((^trtp^Vj_{uF zf$$$6KOeo1(WixvySq<+pV2TeT z`6l>UeKUPq_-6aseVx9&eFyjs_AT)(^)2@u>+AOAd?&emr~A(Io$Wi+0t&@*C*q@*C_|;#cZd?pNtI!H@V&^qcHA)o;4rOuyNFbNv?kt?}FIcf#+U zzru*{yqGA`RDuh^&jkC;$P}t?qBIY+`rm?uKzm!U;O_FU;+XI6ai5I zi2*qQ-2;jPMg{Nzivr#c_%L8`z|w%j0lx*D4LBEYA>fib;7-8PKnN5B(t*N2X`n1n z8<-iG9oRpxJg_owcwlwlxWLJQ3j&u0t_fThxFPUkiChvcNt0wqx=8XRQzSDbTO}7I zwe_=!9CY4G#lmoktg%AB$S*&tbotW;Jm z8!MY3nn)Hp({1Hp@PfeJ=Y#_O0x&?7Hklh$_Sq;t1&% zQW{bdGBRXz$k>o~LZ*aF3z-ozD`ZZ{ypZ)FM?%hp3PUBKs?f;L^iXSPMyM^cWoUM2 zyHIy-Xs6IFq5VSphYkoW4lN5E5jrt+a_H31>7l>KMeRKNeZLFs%W9eQsgKciY|&Cie8F* zMWLcdF;L-B3{q4o-cfLhNs1|onTpwpxr+IU4;8BwA1gjle5%-@*rE7Zu}krdVz1(g z;)znJG$>P)smgSvRhgl*DO)N#C_5@UE4wPYDSIe;Df5-Xl|;Ev`GwMbMTJ#CDw!%& zrBta^T2-F+M)VdbwG7cbx3tYbxifE>Z0n3>ZZaWP|Bi_~IufLfxKs>9Ub>Iij| zx|KRlJxD!7J=Co(Q&*^msjJjA>XGWv>RIYJ>Urt~YF@oa{l5A`^^>XzN^&#~| z^<9lfqt#e79W^dZg{D$7Tr*ZPO*2>Xu4bubnP!D%oo2meqh_n-3(a=T9?f3OcbX%b zAnGWgvbqbwIr_t$j;krm&qApoy)}`vwb&;-5K3k-8tO_-6h=>-BsOn-QT)9y8F6^VN@6nW5RsGs>0l1oI7k% z*p#rFVNb%IhCL5^8D1JbI(%&SJK+<;FNfa^zaRcE{82=|h|-Aih{}lJ5eFkqMVyH^ z8*x6eZDfzgUXl5c1(63MPeq=IJR5mFs(n*qJED$7j+@(Qq-NOCsEI$ zUPe>VbaX&;P_!&s9<7SjM0by#7`-9-c(nUM^yTQQ(buE@j=mlJEc%5W=>_`U`a$|i z{cwG?euRFMp6Dm(r|PHcXX&+9MgujsGoZ|HC7@9H1u|It6u zKhwW7PzKuIV-Onx3=%_zp@kva;4ri{v@_%yIver~Jq*1KeGP?%0S1?0h@sSNs4xsS z)EGt?#u%m=rW5IxYM}bc-(l-c+q&pc+Ggjc+2?2_{{jy1SWxrG5MIHOzlj)Ox32vrh3yx(-zY= zrk_lQOh-(|O(#vKO;=3UOxI0+n{J!#nI4#)n}ueHS!<3p$D0$(NoJ$jY_^%R%sFPK zxwW~Sxr4d8xxaa+**(fU(LBXG-8{=Y*Sx^I#Jt>GXRbG|Hm@^pFn?~|V?Jm;Y(8rK z)%=_JjQLOVU*;R;Tjo3F`{su!l9XmCT~qp}Oix*mvMgn7%GQ)`Qoc>umvSKGV9Mc? z(tx%o?btlFkS$?H zvK%{^oyN{&=dknH#q2V61-p`6#ja)7vs>7m>^}Aw`v-fTy~ti>|75SR_t}5g$Lv$~ zc`8b!QpKtA)QHriRBLKxYRlA|RA*|N)V$Olsl8MCq!y(1PaTjtKD9pev(%qcAEv%Y z6Q_lyxs_>}w6L_uG<}*eEhQ~A&63tU&6d_OEkA8U+LE;OX-Ct}q+LzBoAx4IlAC4O=@ZkJrhlJ)DE(ym<@DR>_tGDxKTdy|{=y=% z_*nuhL6%@ks6}Ckuq0a2Ee=a3OBYL?rMso4+tS-oY#D4Rv6NXVEW<6;mUk@EEb}c( zEo&_sESoH!T0XaIv+T8eZ`p78(Q?po*mA^j+H%!$*Yd(DvieyAtx{`?8mw{F zX4XWj(Q3A4Sld|htUau~t$nS9)&bUX>o9ATb%b@4b*%Lr>lEuk>qpi#*3YfmtnM$Z zUs-orcU$*Z4_S{`k6BMxPg&1c|FE97Ubo)2K5veiA83BG`Q_#}nm=g%JcG#y%+O>+ zWJG7gWF%xHXP7hCjO+}1hBKp0#{7(>8Ot+jGwL(WW?avBnDIE{X~v68$i$g}nbORV zOnIgHq2IS8)+MDn_`=0n_-)6yJ>r3 zdun^$0=4MVVn~ajEy`L{X3flcKkLJ+#aYX;wb}963E4^6rtDeSA7p=&y(HVcJp11q zVU8$AoD+~!k~1>Loij0KO3w70Svl|Kyr1(?&XSzvIkh=o=UmFUYggJM?eX?>dzRg9 zZ)I<5?_lq4?`7{}FR=Hw53rZoYwVnTrhSfmzMZ$fXJ2lwv#+wRv9Gspv~RWVvhTMa zx1Y72w_mdVY5&W9&;HQ<*#58E{@ni3;p31yq8%njbBE25<*++iIXXGII=VZ0I`SQT z9WF