[筆記] Swift 程式語言
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
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
留言
張貼留言