2015年1月19日 星期一

【Swift 筆記 Draft】第 2 講: 基本操作


1. Assignment OP
2. Number OP
3. 複合 compound assignment op
4. comparison op
5. 三元條件 triple condition op
6. range op 區間操作
7. logical op 邏輯操作
8. bit op 位元操作
9. 其他運算 op

OP 種類

一元、二元、三元 operator

Assignment Operator:

let a = "12"
var (length, width) = (5, 8)

Swift 的 assignment op 不回傳值,所以下列錯誤:

var x = 1
var y = 2
if (x = y) {
 ...
}

這在 Objective-C 允許,且判斷為true 真

Number Operator:

+, - , x , / , %

++, --

- (負號)
let a:Byte = 120 let b:Byte = 20 println("\(a * b)") // error, Swift 默認 value 不能 overflow println("\(a &* b0)") // 縱使 a * b 計算結果超出範圍,仍被 println Compound Operator:

+=, -=, *=, /=, %=
Comparison Operator:

==, !=, > , < , >= , <=
恆等號:

object1 === object2
object1 !== object2
判斷 object1 與 object2 這兩個 object 是否引用同一個 class 的實例 (一個對象已分配 RAM,而 object1 與 object2 是否都指向這個 RAM 的位址) 三元條件 Triple Condition Operator:

condition ? true_Return_value: false_Return_value
區間 Range Operator:

閉區間 ...
半開區間 ..<
邏輯符號 Logical Operator:

!a
a && b
a || b
位元符號 Bit Operator:

~, &, |, ^, >>, <<
其他運算符號: 括號 () 可改變運算的優先次序 priority 引用號 . : object要存取 property,使用 method 下標 [] 運算符: 箭頭 -> : function / method 的 return value 逗號 , : 用於 collection中 element的區隔 冒號: 用於 dictionary 中 key 與 value 的區隔

2015年1月5日 星期一

【Swift 筆記 Draft】第 1 講: 語言基礎


Program = Data Structure + Algorithm

Code:

set of statements

Statement:

1. 多個 statement 寫在一行時,以分號 ; 來區分
2. compiler 可以分號(;)或空白字元來識別statement

Variable / Constant Naming 命名

Swift 採用 unicode,Variable / Constant 的 name 可使用中文、符號等。

合法的 Naming 原則:

1. case sensitive 大小寫有區分,例如: Book 與 book 為不同的識別字 Identifier
2. 首字可為底線 underline _ 或者字母開始,但不能是數字
3. 除首字外,identifier 中的字符可用 underline _ , 字母或是數字

Swift 語言非常特別,每個字符採用 Unicode 編碼。

Naming 命名中不可使用:

1. 數學符號
2. 箭頭
3. 保留字
4. 非法 Unicode 字元
5. 連線與制表符號[1]

但,若要引用保留字作為 Variable / Constant 的名稱時,需用反引號(`)來含括。

var `var` = "hello, world"  // type inference
printf("The code: \(`var`))


關鍵字 Keyword:

1. 與宣告 Declaration 有關的 keyword: class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var

2. 與 Syntax 有關的 Keyword: break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while

3. 表達式與類型 Keyword: as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__、__LINE__

4. 在特定上下文中使用的 Keyword: associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、rightset、unowned、unowned(safe)、unowned(unsafe)、weak、willSet


Variable / Constant 宣告 Variable 變量、變數:

var varName = initValue
var varName:dataType

變數 variable 命名 一般首字詞為小寫,若有多個字詞,其字詞首字母為大寫,例如: var studentName:String Constant 常量、常數:

let constName = initValue
let constName:dataType = initValue

常數 Constant 命名 一般為大寫,而以底線 underline (_)來連結兩個字詞,例如: let OMEGA_CONSTANT = 0.56714 1. 靜態語言(例如 Java)的 Variable 的 data type 在 compile 階段就確定,但動態語言 (例如 swift) 則在 Run Time 階段才確定。 2. Swift 是安全性強的語言,Variable 與 Constant 都會指定唯一 data type,但允許以 顯性 / 隱性方式宣告其 data type 3. 若以隱性方式宣告 data type 時, Variable / Constant 需給 init value (???) 4. Variable / Constant 一經指定 data type,其 data 的 type 是不允許以 cast 或任何方式更改 5. 多個 Variable / Constant 被宣告在同一行,則以逗號 (,) 區隔 String 的 cat 操作 1. String1 + String2 + ... 2. String1 + toString(variable/constant/...) 3. "String \(variable/constant)" Data Type 數據類型 1. 整數類型 Integer 2. 浮點類型 Floating Point 3. 布爾類型 Boolean 4. 字串類型 String 5. 特殊類型 (位元組 Byte、可選類型) Data Type 都是以大寫字母開頭 Variable / Constant 在 initialize 初始值設定時,要注意 data type 的值域範圍。 整數類型: 1. Signed Integer: Int8 (Byte / SingedByte)、Int16 (ShortFixed)、Int32 (Int)、Int64 (Fixed) [括號為其alias name 別名] 2. Unsigend Integer: UInt8、UInt16、UInt32、UInt64 3. 整數類型可以十進位制、二進位制(0b)、八進位制(0o)、十六進位制(0x) 表示。 Int/ UInt 是與 platform 有關的整數類型。在32位元平台,Int/UInt 與 Int32/UInt32寬度相同,而在64位元平台,Int/UInt 與 Int64/UInt64 寬度相同。 浮點類型

Float、Float64、Double
指數表示: 10 進位制: 1.32e-2, 2.72e3 16 進位制: p3 (即 2x2x2 = 8) or P3

為增加可讀性, Integer / Floating point 數值可添加多個 0 或底線,例如:

     var rate = 000.002
     var saving = 3_668_108
數值轉換 cast 1. 整數與整數之間 2. 浮點數與浮點數之間 3. 整數與浮點數之間 整數/浮點數間數值轉換 1. 初始值為數值時,compiler 自動cast var var1:Int32 = 100 2. 初值為 variable / constant 時,需 cast var var2:Int32 = Int32(var1) 注意:轉換時,若大範圍的數值轉換為小範圍的數值時,精確度 precision 會喪失。例如:UInt32 數值轉換為 UInt8 數值。 類型 Alias Name

typealias newClassName = originalClassName
typealias NewType = Int64 var var1:NewType = 100 布爾類型 Bool (true / false) let num = 100 let result = num == 200 // result is "false" var isAnimal = true 字元和字串: Swift 字元皆以 Unicode 編碼。 字元宣告:

var charValue:Character = "A"

注意:字元宣告亦使用雙引號。 字串宣告:

var stringValue1:String = "A"
var StringValue2 = String("A")
var stringValue3 = String() //空字串
var stringValue4 = "" //空字串

let A = "A" // data type : Character let B = "12" // data type : String let C = A + B // C = "A12" 特殊字元:

\0: null
\\: slash             /u005c
\t: tab               /u0009
\n: new line          /u000a
\r: return            /u000d
\": double quote      /u0022
\': single quote      /u0027
字串中包含特殊字元: 單字節編碼:\xnn 雙字節編碼:\unnnn (例如:lamda 使用 \u03bb 表示) 四字節編碼:\Uxnnnnnnnn (例如:笑臉 Smile 使用 \U0001f603 表示) n: 0 - 9, A - F 16 進位 字串包含 Unicode字元: let percentage = "\x{25}" let snowflake = "\u{2744}" let heart = "\U{0001F497}" \x: before two hexadecimal digits \u: before four hexadecimal digits \U: before eight hexadecimal digits 字串比較:

運算元 == , < , >
字串大小寫轉換:

let upperCaseStr = lowerCaseStr.uppercaseString
let lowerCaseStr = upperCaseStr.lowercaseString
前綴與後綴的比較:

前綴:string.hasPrefix("prefixValue")
後綴:string.hasSuffix("suffixValue")
元組類型 Tuples: Tuples are ordered lists of values. 將多個相互關聯的值合為一個值,方便管理和計算。 宣告: let person = (18, "John", size:"big") // 或 person = (age:18, name:"John", size:"big") println(person) 獲取: println("age:\(person.0), name:\(person.1)") var (_, name, _) = person println("name: \(name)") println("size: \(person.size)) let area = (10, 20) // area = (length, width) var area = (length:10, width:20) let (length, width) = area length // prints 10 Optional 類型 In situations where you can't be sure a variable has a value present, you can use optionals. Object 的值 value 可為 nil 宣告: var string1 = "12" var num:Int? = string1.toInt() println(num!) // num 一定有 value,否則 error 亦可以下列表示: var string1 = "12" var num:Int! = string1.toInt() println(num) println(num! + 2) //不可寫成 println(num + 2) var s:String s = "ABC" s! // if you know s has a value, then you could unwrap s using an exclamation point (!) Comment: 多行註解: /* ... */ 單行註解: // Swift 允許 nest 巢狀註解: /* this is /* a book */ */

Xcode 提供快捷鍵多行comment: 點選多行 code 後,按住 command + / 可多行註解,解除亦以 command + / 命令。

prettyPrint();