範圍運算值:
- … ==> 下界值 … 上界值
- ..< ==> 下界值 ..<上界值((不含)
區域變數
某語法 {
這裡面有處理到”區域變數”
}
區域變數必須初始化(賦值) initilizde,否則,語法有可能失敗
*在C語言 char = int < 255
在swift語言, character != int => Unicode Scalar = int
*! 保險:超過會給nil
跳脫字元 Escape Charactor
C語言以後,很多程式語言為了表示 0~31 中某些特殊字元用 \+ 一個既有字元的方式來表達,這便是跳脫字元。
特殊變數
- nil ==> 萬一沒有成功!沒值,系統會給出
- _ ==> 雞肋
條件型迴圈:
while 條件{
若”條件”為真!則會進來{ } 執行
}
每次執行完會重新再來一次(if 不會)
若”條件”為假!就離開往下繼續
亂數 Random
所謂”亂數”是指一系列前後完全找不到規則的數列。
在程式設計中,機率賭奕AI人工智慧遊戲大數據...都會用到。
各種語言都有其處理亂數的方式,swift 提供一組”亂數”指令 arc4random()
注意!!用人腦出亂數不切實記得理由是:
- 不能在程式中自動化
- 人總有”行為模式”
指令(參數)
指令(參數1,參數2,參數3...)
指令(參數修飾子:參數)
集合 Collection
以某種規則聚合在一起的”量”,稱為集合
在swift中有三種規則的集合:
- 陣列 - Array ==> 同名,同型態,以索引區分
- 組合 - Set ==> 同名,同型態,無秩序,值不能重複
- 字典 - Dictionary ==> 同名,同型態,元素是以 (key - value 鍵-值) 對子的方式存在,無秩序
補充:
一個不列在 swift collection ,但也是聚合量的型態
雜堆 - Tuple => 隨便什麼,用 ( ) 擺起來就算一個結構
指令(參數1,參數2,參數3) : 一般參數型態
指令(參數修飾子:參數) : 多了修飾子
Literal : 自然值 自然數
+= ==> 加法指定運算子,把右邊的加進去後,值放到左邊
容器 <這裡面的型態可變化 呼叫enumerate 回傳一個新的容器> : 樣板
“動態繫結成功判定”語法
Swift 結合 if 條件式 與 let常數宣告,產生一種新的賦值是否成功的語法,
其語法如下:
if let 宣告一個常數 = 可能會失敗的賦值行為(回傳 nil) {
如果賦值的動作成功!let 宣告的常數中便會裝著賦值,並且判定true,進入此{ }內執行
}
集合類型 (Collection Types)
Iterating Over an Array
for (index, value) in shoppingList.enumerated() {
集合. 指令(參數)
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
物件操作方法
1.物件.方法(參數) == 物件.指令(參數)
2.物件.屬性
enumerated 列舉,重要的參數喔!(就是一堆東西)
shoppingList.enumerated() ,產生TUPLE供操作
Sets 集合
集合有.sorted()可用,陣列也可用
sort 印出的結果,bit 大的會排在前面。
Set Membership and Equality
isSubset(of:)
isSuperset(of:)`
isStrictSubset(of:)` or isStrictSuperset(of:)`
isDisjoint(with:)
let houseAnimals: Set = ["🐶", "🐱"]`
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]`
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)`
// true
farmAnimals.isSuperset(of: houseAnimals)`
// true
farmAnimals.isDisjoint(with: cityAnimals)`
// true
動物符號是unicode 中的編碼
Dictionaries 字典
Dictionary<Key, Value>
[Key: Value] // 此為首選寫法
Optional Value (變數值的保險)
()老師自己講的
基礎知識:在諸多電腦程式當機的原因中,最常發生的狀況是:物件型的變數還沒有內容(沒有賦值,也沒有建立,也沒有用工廠產生!)的時候去使用它!(你可以想像成踩石頭過河,踩到懸空的石頭!)
Swift 為了讓程式強固不容易當掉,對於防止程式設計師耍笨、耍酷、耍XX…,採取了許多阻止、強迫的語法,其中針對物件型變數還沒有值之前就使用,使用了 Optional Value 語法技術。
Optional Value 可以保證你的變數至少會有一個 nil 值。(所以(我個人)稱之為”保險”)
Optional Value 語法
- 在宣告變數時,在型態後面加 “?”
var 沒保險的變數型態
var X:Int
var 有保險的變數:型態?
var X:Int?
- 使用有保險的變數規則:
- 如果程式因為某種原因忘了給它賦值,那麼系統會自動給他一個nil (注意,這並不是正確的,但不會當!)
- 如果程式有給 Optional Value 型式的變數賦值,那麼這個值會以一層薄薄的保護包起來,(印出來)看就像:
var X:Int?
X = 123
print(X) ==> Optional(123) 薄薄的保護層
注意!!123 與 Optional(123) 是不一樣的!!大部分的情況不能直接使用 Optional(123) ,若要取出 Optional 包裹的值,必須在 Optioal Value 後面加 “!”
像這樣
print(X!) ==> 123
在比較簡單的命令列程式中, Swift 比較不會強迫要求程式設計師使用 Optional Value 技術!但在iOS手機程式與Mac OS X 視窗之類比較複雜的程式中,Swift 會強迫要求物件變數一定要有初值,那時就一定要使用 Optional Value 技術語法了。
“!” 加保險與 ”?” 解除保險的概念(剝殼)
var xx:String
xx = readLine()!
if let x = Int(xx) {
///因為Int(xx)這種轉型有可能出錯而沒有值可以交出去!(使用者輸入一個不能轉整數的字串)
/// if let = 某Optional Value ....語法的作用方式是:幫你的Optional Value剝殼(加!所以你不用再加了),如果能成功得到一個合法的值,那麼這個值就指定給let常數
///然後結果判定為true進入{}中去執行(我們就可以在{}中作一些一切都正常得的工作)
} else {
//幫你的Optional Value剝殼的動作失敗,表示這個賦值的動作失敗,系統會hold住不讓他當掉!但是判定為false
//如果你也想在失敗實作一些(補救),就可以加else
}
注意 ??
print(x ?? warning) ==> 不印 nil 改印 warning
(型)值 強制轉型 ==> 把”型”轉成”值”
Literals 自然數
位碼轉換
var x_decimal:Int = 123
var x_binary:Int = 0b01111011
var x_oct:Int = 0o173
var x_hex:Int = 0x7b
print(x_binary)
print(x_decimal)
print(x_oct)
print(x_hex)
Unicode
print("\u{2623}")
Operators 運算子
var x:Int
x = 0 //一定要初始化
x += 1 //指定運算子,自己加1
x += 5
print(x)
Bitwise Operators ==> 比特(位元)運算子
位元 逐次 運算子
比特
直接進入記憶體,將量的位元組合取出來處理的運算子,,共有:
&(且AND)、|(或OR)、^(斥XOR)、~(非NOT)四個 (注意不要與&&、||混淆了)
例: 3 & 5 => 把3的位元組合與5的位元組合 逐次進行”且”運算
3的位元組合 => 00000011 (你可以把1為真0為假)
5的位元組合 => 00000101 &且(and運算)
——————————————————------------------------
00000001 —>1 這個位元組合轉為整數
<< Binary Left Shift Operator
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
0
|
0
|
1
|
1
|
1
|
1
|
0
|
0
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
—>向左位移2位,乘4倍
Assignment Operators 指定運算子
Misc Operators
Operators Precedence
三元運算子
語法:
條件 ? X:Y
true回傳X, false回傳Y
ex. 5<3 ? X:Y —> Y
5>3 ? X:Y —>X
函數 Function
將一段程式用特定的語法包裝起來成為一個可以重複(呼叫)使用的指令,這便是函數。
語法:
修飾字 func 函數名字(參數組合)->回傳值型態 {
包裝的程式碼(自己取)
}
// 修飾字可不取
func love10()->Void {
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
print("I Love U")
}
love10()
修飾字:說明函數的特性
func:函數宣告字
函數名字:自己取
參數組合:函數是宣告在()內的變數,專門提供{}內的程式碼用
回傳值型態:函數執行完後的結果值型態
func love_times(times:Int)->Void{
for i in 1...times{
print("I love you \(i)次")
}
}
love_times(times: 10)
Utility 工具(實用)型的型態
作業:
- 閱讀 Date 文件
- 建立 DateFormatter 的格式
import Foundation
let times = Date()
let calendar = Calendar.current
let year = calendar.component(.year, from: times)
let month = calendar.component(.month, from: times)
let day = calendar.component(.day, from: times)
let hour = calendar.component(.hour, from: times)
let minutes = calendar.component(.minute, from: times)
let seconds = calendar.component(.second, from: times)
print("現在時間為 \(year)年\(month)月\(day)日 \(hour):\(minutes):\(seconds)")
/*
let date = NSDate()
var calendar = NSCalendar.current
print(calendar.dateComponents([.year, .month, .day, .hour, .minute], from: date as Date))
let unitFlags = Set<Calendar.Component>([.hour, .year, .minute])
calendar.timeZone = TimeZone(identifier: "Asia/Taipei")!
let components = calendar.dateComponents(unitFlags, from: date as Date)
print("All Components : \(components)")
let year = calendar.component(.year, from: date as Date)
let month = calendar.component(.month, from: date as Date)
let day = calendar.component(.day, from: date as Date)
let hour = calendar.component(.hour, from: date as Date)
let minutes = calendar.component(.minute, from: date as Date)
let seconds = calendar.component(.second, from: date as Date)
print("現在時間為 \(year)年\(month)月\(day)日 \(hour):\(minutes):\(seconds)")
*/
參考資料
留言列表