Stanford — Developing iOS 11 Apps with Swift 4 #筆記3
第三堂課一開始稍微講了一點Auto layout以及UIStackView,讓我們的Concentration game能夠在不同的裝置以及landscape、portrait狀態下都能有美美的畫面。
再來稍微複習前兩堂學到的東西,就開始這堂課的內容。
#1 — Range
我們都知道在for in迴圈裡需要countable range,可以是一個字串也可以是Int,例如0…3,但是如果是浮點數的話,0.5…10.5僅僅是一個range,浮點數是照著一個一個小數點跑的。
當我們需要用到浮點數去跑for in時,很慶幸地,有一個global function叫做stride()。
利用這個function便可以設定一個countable range。
上面的示範的 i 總共會跑6次,因為我們用的function是through 代替 to。
#2 — Tuples
Tuples就是一個很簡單可以把值變成一個群組的東西。基本上這是有點像Dictionary用名字來呼叫值的,雖然也是可以使用順序呼叫值,但如果要按照順序來儲存值的話還是用Array比較好。
也可以將命名跟儲存值放在同一列。
Tuples時常在function要回傳多個值時候用到。
#3 — Computed Properties
一般我們建立一個屬性時就會設定好預設值,不然就是讓它變成optional。
computed property 有 get(唯讀模式) 跟 set 模式兩種,get 在某個地方要「取得」值的時候執行 get 程式,set 在某個地方「設定」這個 indexOneAndOnlyFaceUpCard 的時候會執行 set 程式。
長得像這樣:
Concentration裡面還有一個更簡單的例子:
這裡的numberOfPairsOfCards沒有get或set是因為它是唯讀模式,只有get,當只有get時便可以省略不寫。
#4 — Access Control
當我們按下control+commamd在xcode Jump to Definition的時候,看一定會看到很多東西在前面加上「public」、「open」、「private」的關鍵字等等,Lecture 3一個個介紹了加上這些字會有什麼作用。
internal — 這是預設的,意思是「在這個framework或app裡面的任何物件都可以使用」,而我們自己定義的屬性與辦法預設都是interal。
private — 只有本身這個物件可以呼叫。
private(set) — 這個屬性在其他地方是可以讀的,但是不能設定。
fileprivate — 一個app裡面可以有很多class、struct等等的swift檔案,在這個source file裡面都允許使用。
public — 只給寫framework的使用,顧名思義可以給任何人使用,
#5 — extensions(待完成)
extension是一個很強大的東西,它可以直接去幫任何class、struct、enum,甚至沒有來源的,加上屬性或方法。
Concentration裡面,這個部分就是要一個亂數emoji然後放進array並且remove,但是要從count轉成UInt32再轉成arc4random_uniform最後轉成Int,真的很難讓看程式的人了解這裡到底在做什麼。
這時候只需要寫一個extension,幫Int加上產生亂數的功能,之後如果有需要用到都可以繼續使用。
這時候在這個class外面加上這個extension
我們就可以直接呼叫。但是如果傳進去的self是0呢?如果是負數呢?
身為一個programmer,就要把程式寫到最好,不會有問題。
所以這就是我們final的extension,不會crash。
#6 — enum、Optionals are enums(待完成)
enum就是一種資料型態,是value type,跟struct 一樣。
enum可以有屬於他自己的資料。
enum不會用來跟 if 搭配使用,enum裡面通常有多個case,要搭配switch,一個一個去看相對的case才執行code。
另外加上default是一個保險的做法,當上面的case有一個是「cookie」時,便執行default程式。
#7 — Data structure review(including memory management)(待完成)
這個部分講到各個資料型態class、struct、enum、protocol。
ARC
記憶體有分三個區塊global、stack、heap。
reference type都是被存到heap裡面。
關於這三個的介紹在這裡:
我們的app如果用到太多的記憶體,就會死掉。而Swift有一個神奇的機制叫做 ARC(Automatic Reference Counting) ,它在每次有變數指到某個class的時候,便會增加一個reference count。
但是如果有一天沒有任何東西在指向那個class,reference count就會變成0,此時這個物件會自動離開heap,不佔用記憶體空間。
雖然ARC已經自動幫我們檢查哪些物件可以丟出heap,但是如果發生reference cycle時,有三個關鍵字可以去影響ARC運作:
- strong:預設的,一般我們在宣告變數時就會是strong,因此不用多加上去。不管怎樣都會留在heap裡面。
- weak:在變數前面加上weak,就不會增加reference count,這個變數指到的class如果死了,這個變數就會自動變成nil,也因為他可能會變成nil,所以一定要是optional。不能用在常數。
- unowned:也是不增加reference count,但是與weak不同的是它不會自動變成nil,所以還是可能會crash。因為不會變成nil所以不會是optional,也可以設成常數。
ARC 的部分真的花了一些時間去了解,也參考了彼得新書,謝謝彼得啦~
請大家多多支持XD