一、在學基本語法以前,簡單看一下與OC的不一樣程序員
註釋:OC #pragma marks 視圖加載完成安全
Swift //MARK: 視圖加載完成閉包
//TOOO:設置背景顏色(Xcode 8.0 特有)ide
//FIXME:更改頭像函數
建立一個視圖View:spa
OC [[UIView alloc]initWithxxx:];指針
Swift UIView(xxx:)調試
類名() == alloc/init 等價code
類方法:對象
OC [UIColor redColor];
Swift UIColor.red
2.0 UIColor.redColor
訪問當前對象的屬性,Swift能夠不使用self.:
OC [self.view addSubview:v];
Swift view.addSubview(v)
建議:都不用,在編譯器提示的時候再添加,會對語境有更好的體會
緣由:閉包(相似OC block),須要使用self.
沒有";"
";"目的分割語句的,在Swift中,默認不須要
枚舉類型:
OC UIButtonTypeContactAdd
Swift ‘.’contactAdd
監聽方法
OC @selector
Swift #selector 若是帶參數不使用‘:’
2.0 直接使用"",若是帶參數使用‘:’
調試
Swift print
沒有時間
效率比NSLog更高
跟蹤函數
OC __FUNCTION__
Swift #function
//2.0語言print(__FUNCTION__)
//3.0語言 print(#function)
二、常量與變量
1》 關於常量let和變量var的選擇:
不可變的會更加安全,開發時,一般使用let,再須要改變的時候,再改爲var
2》若是一個變量從未被改變,會提出警告
//Variable 'x' was never mutated; consider changing to 'let' constant
//變量x歷來沒有被修改,建議使用let
3》修改視圖屬性,依然使用常量
let v = UIView()
//僅僅修改v的屬性,並無修改v的指針地址
v.backgroundColor = UIColor.redColor()
4》若是須要指定變量和常量的類型,能夠使用 let x:類型 = 值
提示:在Swift開發中,極少使用直接指定類型,一般都是自動推導
5》定義變量var,定義後能夠修改;常量let,定義以後不可修改
自動推導變量和常量的類型會根據右側的代碼的執行結果,推導對應的類型
熱鍵:option + click 查看類型
整數:Int 與OC中的NSInteger相似
小數:Double 與OC中的CGFloat相似
6》在Swift中對類型要求異常嚴格
任何不一樣類型的數據之間,不容許直接運算,不會作默認隱式轉化,全部的數據類型肯定都要由程序員負責
7》Swift不在基本數據類型,都是結構體
三、可選項Optional
(1)原始的可選項定義(None 沒有值 或者 Some某一類值)
let x:Optional = 10
(2)簡單的定義
'?'用來定義 y是一個可選項的整數類型
let y:Int? = 20
若是不進行初始化會直接報錯:
Constant 'y' captured by a closure before being initialized
//常量y使用以前必須初始化
不一樣類型之間的值不能夠直接運算,若是沒有值則默認nil,不是任何數據類型,不參與計算,print(x+y)提示錯誤;
解決:'!'強行解包,在可選值中選擇非空值,若是值初始化爲nil,會崩潰
定義y,沒有初始化
let y:Int?
給常量設置數值,初始化的工做能作一次
y = 20
//兩次修改常量會報錯
//y = 3
var 的可選項默認爲nil
//let 的可選項沒有默認值
var x:Int?
//輸出nil
x = 10
x = 100
//輸出可選項100
print(x)
四、邏輯分支
1>簡單的分支
a.條件不須要()
b.語句必須有{}
if x < 6 {
}else {
}
2>三目(三目語法跟OC同樣)
x > 5 ? print() : print()
有時候使用'()'表示空執行
x > 5 ? print() : ()
3>switch
/*
1.switch 能夠針對任意類型的值進行分支,不在侷限整數
2.switch 通常不須要break
3.switch 若是多時,使用','
4.全部的分支至少須要一條指令,若是什麼都不幹,才使用break
*/
func demo(num: String){
//let num = 10
switch num {
case "10","9":
print("優")
case "8":
break
default:
print("通常")
}
特殊的使用,不常常出現
let point = CGPoint(x: 10, y: 10)
switch point {
case let p where p.x == 0 && p.y == 0:
print("原點")
default:
print("")
}
五、可選的判斷
一、if let 和 guard let 的技巧:
使用同名的變量接收者,在後續使用的都是非空值,不須要解包;
好處:能夠避免命名的煩惱
guard 守衛/守護
guard let 和 if let 恰好相反
if let name = name,age = age {
//非空的name和age僅在{}有效
print(name + String(age))
print("------------")
}else{
print("姓名或者年齡爲 nil")
}
//guard let 守護必定有值,若是沒有直接返回
guard let name = name,age = age else{
print("姓名或者年齡爲 nil")
return
}
//代碼執行至此,name和age必定有值
//一般判斷是否有值以後,會作具體的邏輯實現,一般代碼多
//若是用if let 憑空多了一層分支,guard是下降分支層次的辦法
//guard 是Swift 2.0以後推出的
print(name + String(age))
二、if let/var 連用語法,目的就是判斷值
//不是單純的if
if oName != nil && oAge != nil {
print(oName! + String(oAge!))
}
//if let 連用,判斷對象的值是否爲nil,{}內必定有值,能夠直接使用,不須要解包
//if var 連用,{}內能夠對值進行修改
if var name = oName,let age = oAge {
name = "老李"
//進入分支以後,name 和 age 必定有值,不須要解包
//name age 做用域僅在{}中
print(name + String(age))
}else{
print("name 或者 age 爲nil")
}
三、??
??是一個簡單的三目
若是有值,使用值
沒有值,使用 ?? 後邊的值代替
//?? 操做符的優先級低 ,在使用的時候最好加上()
print((x ?? 0) + (y ?? 0))