1.新增可選項(xiàng)
Optional 可選項(xiàng) 成為可選值 修飾符 ‘?’
- 概念 如果我們定義的常量或者變量 他可能有值 也可能為nil 我們就需要把該常量或者變量定義為optional
- 當(dāng)程序員輸入可選項(xiàng)的時(shí)候 系統(tǒng)會(huì)加上Optional 告知程序員你當(dāng)前打印的常量或者變量為可選項(xiàng)
- 可選項(xiàng)不能直接參與運(yùn)算
- 解決方法
- 01 使用‘!’ 強(qiáng)行解包(程序員向系統(tǒng)保證我的可選項(xiàng)一定有值 肯定不為nil)
fatal error: unexpectedly found nil while unwrapping an Optional value
- 缺點(diǎn): 如果我們對(duì)一個(gè)可選項(xiàng)進(jìn)行解包的時(shí)候如果該可選項(xiàng)為nil 的 會(huì)造成程序崩潰
- 02 使用‘??’ 運(yùn)算符
- 可選項(xiàng) 格式 let 或者 var 常量或者變量名: 數(shù)據(jù)類(lèi)型?
- 使用場(chǎng)景舉例
- sex 男 0 女 1 人妖 nil 泰國(guó)
- sex 男 0 女 1 太監(jiān) nil 清朝
- 開(kāi)發(fā)中
-后臺(tái) 頭像 url 第一次登陸 nil 如果不為nil
2.if語(yǔ)句相比于oc,可以省略()小括號(hào),可是不可以省略大括弧,而且也沒(méi)有oc中非零即真的概念,只有ture和flase
func demo1(){
let a:Int? = 20
//這里可以省去小括號(hào)
if a > 5 {
print(a)
}
}
3.可選項(xiàng)判斷
- 可選項(xiàng)判斷 if-let 和 if-var
- 使用if-let 或者 if-var 對(duì)可選項(xiàng)進(jìn)行判斷 如果他不為nil 程序員自己定義一個(gè)常量或者變量記錄他 然后在 我們當(dāng)前的if-let 或者if-var 的{} 作用于中直接使用我們自己定義好的常量或者變量
func demo1(){
let url = NSURL(string: "http://www.baidu.com")
if let _ = url{
let request = NSURLRequest(URL: url!)
print(request)
}
4.guard
-可選項(xiàng)判斷 使用 guard 英文 守護(hù)
- 守護(hù)程序員定義好的常量或者變量 是否有值 如果為nil 的 完成return
- 判斷與if let 相反
- guard 配合 else 使用 還有 return
- 與if-let比較少了一層代碼嵌套
func demo(){
let url = NSURL(string: "http://www.baidu.com")
guard let a = url else{
return
}
let request = NSURLRequest(URL: a)
print(request)
}
5.函數(shù)的定義
// 定義一個(gè)有參數(shù)沒(méi)有返回值的函數(shù)
func demo2(num1 a:Int ,num2 b:Int)->Void{
print(a + b)
}
// 定義一個(gè)有參數(shù)有返回值的函數(shù)
func demo1(num1 a:Int , num2 b: Int)->Int{
return a+b
}
//定義一個(gè)沒(méi)有參數(shù)沒(méi)有返回值的函數(shù)
func demo()->Void{
}
6.閉包
1.閉包的定義
- 概念
- Swift中的閉包與OC中block 相似
- 閉包是一個(gè)代碼塊 在我們需要的時(shí)候執(zhí)行
- 閉包可以作為參數(shù) 還可以作為返回值
- 閉包中使用‘self’ 注意循環(huán)引用
//定義一個(gè)有參數(shù)有返回值的閉包函數(shù),用"in"
func demo3 (){
let closure = {(a:Int , b:Int) -> Int in
return (a + b)
}
print(closure(5,5))
}
//定義一個(gè)有參數(shù)有返回值的閉包函數(shù)
func sum (a :Int,b: Int)->Int{
return (a + b)
}
//定義一個(gè)有參數(shù)無(wú)返回值的閉包
func demo1(){
func sum(a: Int , b : Int){
print(a + b)
}
sum(10, b: 10)
}
// 定義一個(gè)沒(méi)有參數(shù)沒(méi)有返回值的閉包
func demo(){
let closure = {
print("哈哈")
}
closure()
}
}
2.閉包的演練
override func viewDidLoad() {
super.viewDidLoad()
demo { (result) -> () in
print(result)
}
}
func demo(callback:(result:String)->Void){
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
NSThread.sleepForTimeInterval(2)
let str = "返回?cái)?shù)據(jù)"
dispatch_async(dispatch_get_main_queue(), { () -> Void in
callback(result : str)
})
}
}
3.閉包的循環(huán)引用
和oc的block循環(huán)引用的解決方式大抵相同
override func viewDidLoad() {
super.viewDidLoad()
weak var weakSelf = self
closure = {()->() in
print(weakSelf?.view)
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
closure?()
}
deinit{
print("沒(méi)了")
}