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運作:

  1. strong:預設的,一般我們在宣告變數時就會是strong,因此不用多加上去。不管怎樣都會留在heap裡面。
  2. weak:在變數前面加上weak,就不會增加reference count,這個變數指到的class如果死了,這個變數就會自動變成nil,也因為他可能會變成nil,所以一定要是optional。不能用在常數。
  3. unowned:也是不增加reference count,但是與weak不同的是它不會自動變成nil,所以還是可能會crash。因為不會變成nil所以不會是optional,也可以設成常數。

--

--