一.可選類型(重點(diǎn)內(nèi)容)
1.什么是可選類型?
1.1在OC開發(fā)中,如果一個(gè)變量暫停不使用,可以賦值為0(基本屬性類型)或者賦值為空(對(duì)象類型)
1.2在swift開發(fā)中,nil也是一個(gè)特殊的類型.因?yàn)楹驼鎸?shí)的類型不匹配是不能賦值的(swift是強(qiáng)類型語(yǔ)言)
1.3但是開發(fā)中賦值nil,在所難免.因此推出了可選類型
目的:讓代碼更加嚴(yán)謹(jǐn)
2.可選類型的取值
可選類型要么是:空值 , 要么是:有值
只有為可選類型,才能賦值為nil
3.定義可選類型
3.1 普通寫法
var name : Optional<String> = nil
3.2 簡(jiǎn)單寫法(語(yǔ)法糖)
var name : String? = nil
4.給可選類型賦值
4.1 普通賦值
name = Optional("why")
4.2 直接賦值
name = "why" // 系統(tǒng)會(huì)對(duì)字符串進(jìn)行包裝Optional, 再進(jìn)行賦值
5.強(qiáng)制解包(取出可選類型中具體的值)
5.1 為什么要強(qiáng)制解包
可選類型的值的格式為: Optional("why") 我們要想使用其真實(shí)值,必須要解包
5.2 怎么解包?
在可選類型的標(biāo)識(shí)符后面加!
print(name!)
注意:解包前,要先判斷可選類型是否為nil , 如果為nil,強(qiáng)制解包會(huì)報(bào)錯(cuò)
6.可選綁定
if let name = name { print(name) print(name)
}
6.1 系統(tǒng)先判斷可選類型是否為nil,如果為nil,就跳過(guò){}中的內(nèi)容
6.2 如果有值,會(huì)先對(duì)name進(jìn)行強(qiáng)制解包,然后把解包結(jié)果賦值給name

7.可選類型的應(yīng)用場(chǎng)景
可選類型能讓代碼變得更加嚴(yán)謹(jǐn)
類型轉(zhuǎn)換后的數(shù)據(jù)類型一般都為可選類型,因?yàn)檗D(zhuǎn)換不成功就為nil , 只有可選類型能接收nil
7.1字符串類型轉(zhuǎn)Int類型

可以看到,類型轉(zhuǎn)換后的類型為可選類型
使用轉(zhuǎn)換后的結(jié)果的時(shí)候,一定要先判斷是否為nil, 如果為nil, 使用會(huì)報(bào)錯(cuò)
7.2 根據(jù)string創(chuàng)建一個(gè)NSURL
let urlString = "www.baidu.com"
let url : NSURL? = NSURL(string: urlString)
if let url = url {
let request = NSURLRequest(URL: url)
}
if let url = url 內(nèi)部做了以下判斷:
1.判斷url是否為nil,為nil 就跳過(guò){}中的內(nèi)容
2.不為nil,就對(duì)url進(jìn)行強(qiáng)制解包
3.將解包后的結(jié)果賦值給前面的url
7.3 根據(jù)一個(gè)plist文件創(chuàng)建一個(gè)數(shù)組
let path = NSBundle.mainBundle().pathForResource("123.plist", ofType: nil)
if let path = path {
NSArray(contentsOfFile:path)
}
二.類型轉(zhuǎn)化
1.is的使用:判斷是否是某種類型
//1.is的使用
let infoArray = ["why" , 18 , 1.98]
let item = infoArray[1]
//item.isKindOfClass(UIButton.self)
//string是結(jié)構(gòu)體,不能用isKindOfClass
if item is String {
print("是字符串")
}else {
print("不是字符串")
}
2.as的使用
2.1 as直接使用: swift類型和oc類型的轉(zhuǎn)化
let urlString = "www.baidu.com"
(urlString as NSString).substringToIndex(3)
2.2 as? 的使用: 將NSObject轉(zhuǎn)成某一確定類型的可選類型
let item1 = infoArray[0]
let name = item1 as? String
if let name = name {
print(name.characters.count)
}
簡(jiǎn)寫:
if let name = infoArray[0] as? String {
print(name.characters.count)
}
2.3 as! 的使用: 將NSObject轉(zhuǎn)成確定的類型,但如果轉(zhuǎn)化不成功,則程序會(huì)崩潰
let count = (infoArray[0] as! String).characters.count
三.函數(shù)
1.函數(shù)的介紹
1.1 函數(shù)相當(dāng)于OC中的方法
1.2 函數(shù)的格式如下
func 函數(shù)名(參數(shù)列表) -> 返回值類型 {
代碼塊
return 返回值
}
1.3 func是關(guān)鍵字,多個(gè)參數(shù)列表之間可以用逗號(hào)(,)分隔,也可以沒(méi)有參數(shù)
1.4 使用箭頭“->”指向返回值類型
1.5 如果函數(shù)沒(méi)有返回值,返回值為Void.并且“-> 返回值類型”部分可以省略
2.常見的函數(shù)類型

3.內(nèi)部參數(shù)和外部參數(shù)
3.1 什么是內(nèi)部參數(shù)
3.11 在函數(shù)內(nèi)部就可以看到的參數(shù)(標(biāo)識(shí)符)就是內(nèi)部參數(shù)
3.12 默認(rèn)所有的參數(shù)都是內(nèi)部參數(shù)
3.2 什么是外部參數(shù)
3.21 在函數(shù)外部就可以看到的參數(shù)(標(biāo)識(shí)符)就是外部參數(shù)
3.22 默認(rèn)從第二個(gè)參數(shù)開始都是外部參數(shù)
3.23 如果想讓第一個(gè)參數(shù)成為外部參數(shù),可以設(shè)置標(biāo)簽:在變量名前加標(biāo)簽即可
3.24 如果不想要外部參數(shù),可以在參數(shù)名稱前加_ (_ 和參數(shù)名稱中間要加一個(gè) 空格)
3.25 也可以給外部參數(shù)設(shè)置標(biāo)簽 ,相當(dāng)于給外部參數(shù)起別名

4.默認(rèn)參數(shù)
4.1 什么是默認(rèn)參數(shù)?
如果一個(gè)函數(shù)需要參數(shù),而我們調(diào)用的時(shí)候又不想傳參,那么在設(shè)計(jì)函數(shù)的時(shí)候,可以給函數(shù)一個(gè)默認(rèn)的參數(shù)
如果調(diào)用函數(shù),不傳參數(shù),就按照默認(rèn)的參數(shù)對(duì)函數(shù)進(jìn)行處理

5.可變參數(shù)
5.1 swift中函數(shù)的參數(shù)個(gè)數(shù)可以變化,它可以接收不確定數(shù)量的輸入類型參數(shù)
5.2 它們必須具有相同的類型
5.3 我們可以通過(guò)在參數(shù)類型名后面加入(...)的方式來(lái)指示這是可變參數(shù)
作用:方便需求變化時(shí),更改代碼,當(dāng)參數(shù)個(gè)數(shù)需求變更或很多時(shí),可以輕松些代碼

6.指針參數(shù)
6.1 默認(rèn)情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址
6.2 必須是變量,因?yàn)樾枰趦?nèi)部改變其值
6.3 Swift提供的inout關(guān)鍵字就可以實(shí)現(xiàn)

7.函數(shù)的嵌套
swift中函數(shù)是可以嵌套的,即函數(shù)中包含函數(shù),但是不推薦該寫法
OC中方法不可以嵌套
// 函數(shù)的嵌套
let value = 55
func test() {
func demo() {
print("demo \(value)")
}
print("test")
demo()
}
//demo() // 錯(cuò)誤 必須在對(duì)應(yīng)的作用域內(nèi)調(diào)用
test() // 執(zhí)行函數(shù)會(huì)先打印'test',再打印'demo'
8.函數(shù)的類型
8.1什么是函數(shù)的類型?
每個(gè)函數(shù)都有自己的類型, 函數(shù)的類型由 函數(shù)的參數(shù)類型和返回值類型組成
// 定義兩個(gè)函數(shù)
func addTwoInts(a : Int, b : Int) -> Int {
return a + b
}
func multiplyTwoInt(a : Int, b : Int) -> Int {
return a * b
}
這兩個(gè)函數(shù)的類型是 (Int, Int) -> Int
8.2抽取兩個(gè)函數(shù)的類型,并且使用
// 定義函數(shù)的類型
var mathFunction : (Int, Int) -> Int = addTwoInts
// 使用函數(shù)的名稱
mathFunction(10, 20)
// 給函數(shù)的標(biāo)識(shí)符賦值其他值
mathFunction = multiplyTwoInt
// 使用函數(shù)的名稱
mathFunction(10, 20)
8.3 函數(shù)作為方法的參數(shù)
// 3.將函數(shù)的類型作為方法的參數(shù)
func printResult(a : Int, b : Int, calculateMethod : (Int, Int) -> Int) {
print(calculateMethod(a, b))
}
printResult(10, b: 20, calculateMethod: addTwoInts)
printResult(10, b: 20, calculateMethod: multiplyTwoInt)
8.4函數(shù)作為方法的返回值
// 1.定義兩個(gè)函數(shù)
func stepForward(num : Int) -> Int {
return num + 1
}
func stepBackward(num : Int) -> Int {
return num - 1
}
// 2.定義一個(gè)變量,希望該變量經(jīng)過(guò)計(jì)算得到0
var num = -4
// 3.定義獲取哪一個(gè)函數(shù)
func getOprationMethod(num : Int) -> (Int) -> Int {
return num <= 0 ? stepForward : stepBackward
}
// 4.for循環(huán)進(jìn)行操作
while num != 0 {
let oprationMethod = getOprationMethod(num)
num = oprationMethod(num)
print(num)
}