[筆記] Swift 程式語言

Swift Note

ARC: Auto Reference Counter
  • 如果忘了 ++ 的話 可能會有 run time error 因為當 reference 是 0  的時候,系統可能會自動回收,但是你還在用用到一半時,就會 ERROR
  • 如果忘了 -- 的話,就容易造成 Heap 滿 memory leak

ARC 會 maintain 一個 String reference to class instance property, constants, and variables to restrict de-allocation when class instance is currently in use.

Types:
如果變數是 reference type 時, 才會 pass by reference
如果變數是 value type時,他pass是 copy

只有class的時候才是 reference type
其他的 dictionary, array, double, string 等等都是value type
swift 的 array 的 implement 是用 struct 

以下使用 Swift Class 來解釋 Reference Type 
Reference 的 type:
  • strong reference: 會 increase retain count 
  • weak reference: 不會 increase retain count 允許 nil,只能宣告給 variable,不可以給 constant !!! (寄生蟲的觀念,為了避免 memory leak)
  • 用寄生蟲解釋,在weak reference機制下,要看寄生的母體Object 存在才能存在,一旦母體Object死掉了(free掉了),用weak reference來寄生的變數就會一起死掉,假設這裡我們採用的是 Strong reference 的話,母體死掉後,寄生蟲還存在,參照還在的情況下,Free不掉,就容易造成Memory leak!
  • Un-owned reference: 用在 recursive relationship ,此時如果沒有用 un-owned 這種機制,reference counter 會你加我我加你 confuse 造成 deadlock


Value v.s. Reference
Value (struct & enum)
  • pass argument to function 時,他會pass by value 做 copy 的動作
  • Copied when assigned to a different variable
  • Immutable if assigned to a variable with let <-- 宣告常數變數的用法
  • 如果我傳參數進一個 function 想要實現 pass by reference 這種效果 要使用關鍵字  input output 來實現這種效果。
Reference (class)
  • Stored in the heap
  • ARC: automatically reference counted
  • When passed as an argument, just passing a pointer to same instance


XCode IDE 的 Playground
輕量的區域可以用來 try swift 語法
(快捷鍵 option + shift + command + N)

語法重點


Q: 下面這樣的寫法,總共有幾個 Instance 
答:三個!在swift 裡面,這樣寫會在 memory 裡面 allocate 三個空間

Enum
這是Swift跟別人不一樣的特別Feature
例如:
enum Filter {
  • case Albums
  • case Playlists
  • case books
}
使用用法:
let type = Filter.Albums
另一種寫法
let type:Filter = Albums

例子:
let v = UIView
v.contentMode = .Center
這裡的 .Center是個縮寫,全名為 UIViewContentView.Center

Enum 跟變數一樣可以宣告指定的 Type
enum UIViewContentMode: Int {
  • case ScaleToFill
  • case ScaleAspectFit
  • case ScaleAspectFill
  • ... (下略)
}

Struct
例子:
Struct Constants {
  • static let NumberOfRows = 10
  • static let NumberOfColumns = 15
}
<註>
static: 它只屬於 type,不需要instance ,可以直接傳data進Type裡面

Class 
宣告的寫法:
class Person {}
繼承寫法:
class Student: Person {}
Swift 裡面的 Class 可以實作出 Protocol
protocol (在 java 裡面叫做 interface): 可以implemet它,但是它不能create 一個實體的 Object出來

Function 
keyword: func
return type 定義寫在 -> 的後面
舉例:
func exec(argument:String) -> ReutrnType {
  ...
}

Optional
Swift 嚴格規定任何變數都一定要initialize!
但是不大可能什麼事情都要事先知道
所以我們需要 Optional 的用法
在寫software時常常需要寫 if 來檢查各式各樣的問題
用法: 如果我這樣寫 String?
這個 String 就是一個 Option String 
Optional 的實作是利用Enum
概念解說:如果這個Type存在的話,就return 
Enum Optional<T> {
  • case Nil
  • case Some<T>
}
寫法舉例:
let x: String? = nil
另一種寫法:
let x: = Optional<String> Nil
例子2:
let x: String? = "hello"
另一種寫法
let x: String? = Optional<String>Some("hello")
將 Optional 解除設定 (Unwrap) 的用法
var y = x! // 欲把 Optional 拿掉要使用 ! 符號
此時如果 x 好死不死他剛好是 Nil 那這樣的用法下就會Crash
這裏 x! 的效力只有一行 當下有效,出了這行 x 還是 Optional

 Swift 裡面 空白 不等於 nil


程式語言中的區別
interpreter v.s. compiler
  • interpreter: 例如Visual basic ,每次執行時都是重新run
  • compile 完的時候,他會產生 machine code,下次執行時直接執行產生的machine code
  • Java 除了 machine code 以外,他自己多加一層 byte code
並且在自己的virtual machine 上面處理 byte code 到 machine code 這步驟

iOS
開發Tools Xcode/Playground/Instruments <— 這個可以用來抓 Memory leak
Frameworks : shared library

iPhone 6s 開始用 64 bit!

iOS 使用的設計模式: MVC
MVC architecture 可以從常見的 Library 看出有 Model, View, Controller 的字樣
UIImagePickerController: 最前面的 UI 代表他要 import UIKit
UIKit: UI 相關的 Library
AVKit : Audio Video Library

Handof: 使用者經驗相關
Cocoa Touch 的 features
Auto Layout: 手機旋轉後可以自動排版 -> dynamic UI
Storyboards: 用來設計UI
Apple Push Notification Service: 可以跳出訊息到畫面上
Gesture Recogniser: 可以判斷手勢 從右到左,從左滑到右,放大手勢 縮小手勢 等等
View Controller: 有各式各樣的Control


留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking