From 5686e0d1c02043d8cb382f21be6675d92d05c8a3 Mon Sep 17 00:00:00 2001 From: jiulinxiri Date: Mon, 10 Jan 2022 00:02:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 10 属性 inout.playground/Contents.swift | 86 ++++++++- .../Resources/README.md | 178 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 14675 -> 15615 bytes 3 files changed, 262 insertions(+), 2 deletions(-) diff --git a/10 属性 inout.playground/Contents.swift b/10 属性 inout.playground/Contents.swift index dc81a8a..a7afccc 100644 --- a/10 属性 inout.playground/Contents.swift +++ b/10 属性 inout.playground/Contents.swift @@ -6,8 +6,8 @@ struct Circle { var radius: Double // 计算属性 var diameter: Double { - set { - radius = newValue / 2 + set(newDiameter) { + radius = newDiameter / 2 } get { radius * 2 @@ -18,3 +18,85 @@ struct Circle { var circle = Circle(radius: 5) print(circle.radius) print(circle.diameter) + +struct Point { + var x: Int + var y: Int + // 初始化器设置初始值 + init() { + x = 10 + y = 20 + } +} + +var p = Point() + + +struct Point3D { + var x: Int + var y: Int + var z: Int +} + +var p3d = Point3D(x: 10, y: 20, z: 30) + +struct PointA { + var x: Int = 10 + var y: Int = 20 +} + +var pa = PointA() + +class Car { + init() { + print("Car init!") + } + + func run() { + print("Car is running!") + } +} + +class Person { + lazy var car = Car() + init() { + print("Person init!") + } + + func goOut() { + car.run() + } +} + +let ps = Person() +print("-----------") +ps.goOut() + +struct PointB { + var x = 0 + var y = 0 + lazy var z = 0 +} +let pb = PointB() +//print(pb.z) + + + +struct CircleA { + var radius: Double { + willSet { + print("willSet", newValue) + } + didSet { + print("didSet", oldValue, radius) + } + } + init() { + self.radius = 10 + print("Circle init!") + } +} + +var circleA = CircleA() +circleA.radius = 10.5 +print(circleA.radius) diff --git a/10 属性 inout.playground/Resources/README.md b/10 属性 inout.playground/Resources/README.md index 9f56c87..976d005 100644 --- a/10 属性 inout.playground/Resources/README.md +++ b/10 属性 inout.playground/Resources/README.md @@ -30,3 +30,181 @@ struct Circle { 3. 结构体、类可以定义存储属性 4. 枚举 `不可以` 定义存储属性 +Swift 中存储属性的规定 + +* 在创建结构体或类的实例时,必须为所有的存储属性设置一个合适的初始值。 + + * 可以在初始化器里为存储属性设置一个初始值 + * 可以分配一个默认的属性值作为属性定义的一部分 + + ```swift + struct Point { + var x: Int + var y: Int + // 初始化器设置初始值 + init() { + x = 10 + y = 20 + } + } + + var p = Point() + + struct Point3D { + var x: Int + var y: Int + var z: Int + } + // 初始化器设置初始值 + var p3d = Point3D(x: 10, y: 20, z: 30) + + // 分配一个默认的属性值 + struct PointA { + var x: Int = 10 + var y: Int = 20 + } + + var p = PointA() + ``` + + + +#### 计算属性(Computed Property) + +1. 本质是方法(函数) +2. 不占实例的内存 +3. 结构体、枚举、类都可以定义计算属性 + +Swift 中计算属性的规定 + +* set 传入的新默认值叫做 `newValue` , 也可以自定义。 + + ```swift + struct Circle { + // 存储属性 + var radius: Double + // 计算属性 + var diameter: Double { + set(newDiameter) { + radius = newDiameter / 2 + } + get { + radius * 2 + } + } + } + ``` + +* 只读属性:只有 `get`,没有 `set` + + ```swift + struct Circle { + // 存储属性 + var radius: Double + // 计算属性 + var diameter: Double { + get { + radius * 2 + } + } + } + ``` + +* 定义计算属性只能用 `var`, 不能用 `let` + +##### 枚举 rawValue 的原理 + +枚举原始值 `rawValue` 的本质是: 只读计算属性 + +#### 延迟存储属性 (Lazy Stored Property) + +使用 `lazy` 可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化。 + +* `lazy` 属性必须是 `var` , 不能是 `let` + * `let` 必须在示例的初始化方法完成之前就拥有值 +* 如果多条线程同时第一次访问 `lazy` 属性 + * 无法保证属性只能被初始化 1 次的,是线程不安全的 + +```swift +class Car { + init() { + print("Car init!") + } + + func run() { + print("Car is running!") + } +} + +class Person { + lazy var car = Car() + init() { + print("Person init!") + } + + func goOut() { + car.run() + } +} + +let ps = Person() +print("-----------") +ps.goOut() +``` + +输出的结果 + +> Person init! +> +> \------------ +> +> Car init! +> Car is running! + +##### 延迟存储属性注意点 + +当结构体包含一个延迟存储属性时,只有 `var` 才能访问延迟存储属性 + +* 因为延迟属性初始化时需要改变结构体内存 + + jiulinxiri_20220109234238 + + + +#### 属性观察器(Property Observer) + +属性观察器类似于 OC 的 KVO,可以为非 `lazy` 的 `var` 存储属性设置观察器。 + +```swift +struct CircleA { + var radius: Double { + willSet { + print("willSet", newValue) + } + didSet { + print("didSet", oldValue, radius) + } + } + init() { + self.radius = 10 + print("Circle init!") + } +} + +// Circle init! +var circleA = CircleA() +// willSet 10.5 +// didSet 10.0 10.5 +circleA.radius = 10.5 +// 10.5 +print(circleA.radius) +``` + +> willSet、didSet 以及 set 方法是不能共存的,因此计算属性不能设置属性观察器 + +* `willSet` 会传递新值,默认叫 newValue +* `didSet` 会传递旧值,默认叫 oldValue +* 在初始化器中设置属性值不会触发 `willSet` 和 `didSet` + * 在属性定义时设置初始值不会触发 `willSet` 和 `didSet` + +#### 全局变量/局部变量 \ No newline at end of file diff --git a/10 属性 inout.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/10 属性 inout.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate index 2e9ca926dac0df41c97ea191a0dc78dc7d923630..7e65190dfa1f8bde892def75816e9f5cf33637eb 100644 GIT binary patch delta 7398 zcmaJ_2Ygdi+dt1aNs~0Qq-oNTCTVuk%zAc8^{ z8$>K3B7%y@5CL06WW0hn5E-&X1iq7`MSXpLU+yo-z4xqV{r}H%PHpkiDT}kA-IAPc zftS%MXbzf(7NSLHFeTj~v6X+!R3e})mbP9cq zPNTEv68aJSgl?dl=r+0oQjmch6rcnZ#6Sa3Lo8?@9*p1sC%B*)G=~<@5?VnTJO{0z z1M~<$Pv`}`p%3(hVK5v8M;S_ug-@!$=1mD9AxCy_(Ew~ML;3510Pv9vQU?G-b z8J6RK8pmQS*5M|&DQzSERkXu?%RG3}N zI?qSF%;`xe{80_6AGQQ7Lva;qv=jwtD)m&Lu6)zv;u8F8)V%$0+bE)H z+9XSrzf?FVctM;fdN=&0S@5ZN(%|>d$H=uA?LzOP-RJ|f2Yrb4qL0u%w4b)1Eom#7 zMxUdtX&c&>rqgzt(I+S?d>ureGpl8xBgjnKhb?WR8MGs_o{e^57WY-3ko1AK?j}9-!aRL-YrFg#JX2(G%K@cBegPPuh$2rhRB%no0X@ z22`h1PDCjXGo||1DP^xyYG9pGy%{~kF|9yL2h?c=3ICr~U;;~6b}%#92Qi0(jX8WU zb&SX>%AGjQUs&4RUzlGyDh5xjQvlr15V@)#6+GYtjt-^6=x{os3VhHA8q1&w&7v>R zY?{LYdZ&Cvn>NtC652vKw4=GSfELn8^%G@4XXL7cj?f97r+L&*M^-`?=n6iXPe-v? zd|4`6aEBr}xLz@_RVEDlSLZ=67>3Z%bPOF!ede}xZplSPD@Mi|$U;hZ0kW(6D=(4J zQ@8P+4?hJCPS#Vv|yay-0r}^ zH5M3gl}?PvLV=Gg>#qQcdS$5^4EC3l`it|jrx>$Kjg1<&YT78$a~8}V@l5J4+$&*L z2=HN|fH|Q+Za@jG4_2553(!DU_+>dPq*JLc(sK#4kMx`rd0r0f%V^#GN;J6=wMFY- zHI1Q7>5R~9&yWgbVO-99hSZqOVWxpf*n(UepbFN(de{IPVH0eol=Ac?`ZAqGXVX_U zz*g9XvS2%`LuQmk=g?QFjfZsBN5EA**GRRHLs^(;2D8X+B@e7OBSOO&iXb zQSXnB;9zK#eXt)shEL#AH~^o~x%4$UkIttH=t8<^12V%QI1ESNC|m0on|d*=pp|qz zTVewX#Vv8KnNGvmPz-$oXW(19gf6AQN;n7S;R0Po*U~c9Yk;Tj$T>l9E zgvY@-x@5A3z7^c4>q{EMB?KSqxR}9x{Ut>ci*x-YDyUH?RWZS|c&qB*>uH-hKT)9? zkyss55vvLM?Al;zyjWPH)y0Rq$PWe^A6fbi>yQ{zo)l^q)+8H@;Wp*LV3V&G*&4GT zTbpp~+i5{vf{VnIyTh{#ONckU#>jaIqvLAEq5IGQ#wHh7wQ?0bW>ty?5+EtKBB6r- zBMiX{2`&M~m;|MXieZoK3631g3a&5&4I1wjdJx<03Y{Vv_XFVD)wM6=Gc=DH=;Y~d-N0fDWmJp=t259tz}QAcu2)8vNk0R zhn)5}BP3l1x~m*_r0<6?8j~@gU*`C+1*HQD{FAzr`p1=o;efk9`wH9@ccZ)MzGpmz zd*Z$*t`hgcy>TD<0o_ACti+kfjQi8QEX+P)E+3VgHh6qk&3a1>$JzfHlf%a3(fw@9 z$JCLfQg+GcnBmWvn4j-2ZddHjHmAQ3v6Kqc;?Z~vOOm${kH-f8Om@T{2onJ=#6?4U zW_Bse^H1)bT{@})j}Nvsm{Lk`DRPyu06vW;;mLRkQsSw28lH}4;F&mpDdvOJFk1R0 zJxou~8hVHx3*Ixd@XlhqfoIbr4C(k)JeQ4njhT1;kS=+Q_X|cA_>238m!e0Rb-xHl zQkGpPz>DzW;98@BRNy7Sw~VQQWo+bf)EU2yIt{H)8~yus9~@%6lG5yP<7oqWoU%%p z)hu`wUY(^`+}&f!_>~;Qwl3aKdZwT3j|{JkvU}w78%!pMFJ87O7ez z4h1`#W;iQx)lfERr-HHmh-KEHUVncPS$qTD7`$Qfz@}hQO4Ix;cx%LL5$|tj=b7FY@PF`k_#(c9zsHyH5BNva7XKWaZ{9xW3B5vpq2Kd>=u<}7 zkN@fXU+~pB=ii_|)5~>^|0$v>D@w}oE&9V>p1&LNJpJ*Rqc>Tk%D?$Fkkhpef21*K7OrbZQ&!jf8LG)vu$qh&vj0`ru%f&n3+yI=wj@1E70VzQ@muGD z66U=rA#SK3?Lu++KimH0DAIvspiZO{{(*Ex>qu7~@x+>RWRoV7DzVUC>dngzfo^0$ zu|Fq!>{#!(?BX$bMUx7H3j__L|5`W15rK%*;~ARB1RhkZz96MYNhXpPvsAj=iN(c? zUH)Zd9%6WK{o9_C@g*{qOk?((5ej@B9P|ngIvyH??dkki;FGpIc_|Y4xkIcM^K)_}f`P*{l?VIZKoH#N>Oj6CHNihz2~Zo< zxSIq{lXI-WWQW(%F#i*;9%pmWBv$aNmObQQ^+@qWwgE4XySwxk7#+S9xf}Y}J^DCOkB) zV%C|?@EY2znHgq7l<UgG@Iep^aaym=L0)?Q#zecMgqg&UF{+FtPctIkQTfjo1 zZ8_t7#`vuM=ulKxQZ&}jvK6cMLnaFERs=@K?iC~0R_*n)g4QA`pwTf@Nrg04g<>?r zx2rUEhtuUw^>~{$doH7Ex9+|A4;VOPcz;Xb#Ia+uRQi@pLM5~@R6hqRyi?N}HyL2b z9h+TJGH6mkAwz4I3`S$){lz7W+!zM`O7m2rB2+vet7m2_U-O#gEn2n;W(#B4wmi9K zX76YH`*-PBn9F3%>+2usXCTh?SF}tU)HAbJ&S-ybX>IE^T-$aXf-$OCRXUZHw`Y>8 zYdd!0p6}cx*oE^6WmHZT!2s7p-@HYSo@_spnOp4l7e>OQqDNY7?>=1L%znY^T-$gR zgLMPO7SpEv*S;Xwv7yo3yv3lwZ2Z8mQg!18r7^jO4*TaZ$I!Ik;)WvvxojIZ7Z$PY zL+C8*8aw&=0~1z(Cb8<%$O_9;cF>iMvvD3fz$#@`(;Pe(&tu0|i|`V>5?8ZBs-yTA zK929Pq!&dr>|DygPMwC6EOyS6OJ=`U#2z;{`JWF9~J|02^I(z z36=;x5!@0y5rU8iql98%v`{NF2;D-DkQ4fZ^M%WWWx`Fu?ZTbHkAz2smxPyvKMH>q z{v!NUcwKl?cuROkcu)8sN)e@sY7iA06&Iz8N{C8|N{%u{r9@exY*8Jea-v>|+8A{# z>b6KJYAot2njl&#S{)Fr5tWH5L|a5VMY}}1MSDbhMf*e_i#`>7Ci+tJwdkzqoal<^ z7tvMGHPJmW7K_9xaRaeIY!TbU4zWkfiGAY6;+Eph;y&WO;(p?R;upjP;(+)SaZtQc zyh{A0xLjN*UMJol-YMQC-YwoEu}FN9#*(Iz=92Z2YDwU*L=@=)?f@>udT8lp+GFj^FCiS7`cA3ZmETXb#o18JPJskEnxqI9x!s&u+^rgWZkzI1_fk#wbWopiHwtMqMYwe&sd`_d1jhoxUhYow>7 zr=^#rzXzm$NdJ^Rks%qD31m?+u`F69lbK{@nN?<&Ic08{N5;u~vc|HevgWdWvJ%inueN| zn&&iaH0hcyny#Aen*N$$nh}~8G&!0)%>+$}W};@2=91=y=CS5!9K?}0VVo#V5+{vI zh)aq~jx)xYhI9oH&uT3l7!iMU%@xz?fWpzW>A(q?OOwSH~Bwm>^ZJ5D=Y zJ5x)wFKK6KU(vp*eN8)GyH@+I_H*sG+Uq)`Q|JrX?xO+q@78-l6EIuO!_71e$vCFM@digNRRb4 zJ*RJ|Z=_Gtch+a?bM=0GzP>;|Mn6tpq@SQK(NEM*(ofMZ)i2Yp(67|5(!Z%+qc77} z=&SVW^&9npE&6TxllmX@HG?mi3ZNl z!qD2#*3iz-!O+_<&@k9A)G*wTXBcT1Wf*N3YnW=7V_0RVGHf&KF??b;U^r+vWH@d( zX{a%rGMqMCG2AlTF(PBE(Qb4a8yVXeI~aQzhXjoI#!9*;v>2ZoWMVI1DX`a$PB_pL%%7K()DQ8kHr2LX{+pIUIn0uIqn1`B&nMauO&7;j@ z&4EJmH1n(G*UapHBI`c;JX7e`lcJmJNUh_%wPv*N8WHDM&ES#l@ zrJ1FLrM0E4rJbdNWsqfzrPMOTGR-p6LM`Q%k1UrgcdRj1tJP=iW$k0lwDz|Sv<|Tj zvyQO7V4Y%}W}RUTSb6Kq*4fsD)+GUJ(7N1OVXd;Rw{EoVw;r~BZT-gjt@WJso(
jdZgbk)Hjj<7b+UD~b+vW3^|bZ2^|kf04X_Qe4Y3Wgjj&C#t+MU2 zU9=1AE_*k7k$s_koBgQ0)_&T4#(vg**?!G_!~UE7w*9XCzWsOmAC3TV2ptU^T1UJi z(P4C?I4lmEqp8F1nC=KV-gHzub~{cueskP$+;{x$c;tBE1SfGuIStMfr`2h9I-PE( z$Jxx;+L`X`;Oyk=?CkFxD=zz>)hx3*!ijR zqD$pUaQR%V0^ zkn5(21_EB* z`?9y(yU%;c`v)iDqB%LI;?$gmb8?Ni=3FbTHP@Ew&Si4_xq;kZ?gcKF^K+xP(Od~P zotw)o=9Y5HxE0)6Tp3rvt>ZRuJGgz^C){V;A?^tG1@|3yrO6wS8Uy3VzaZsrHHVPh HH(C9E6ME4= delta 6733 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