swift語(yǔ)法(三)

一.可選類型(重點(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

Paste_Image.png

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類型

Snip20160813_1.png
 可以看到,類型轉(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ù)類型

Paste_Image.png

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ù)起別名

Snip20160813_4.png

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)行處理

Snip20160813_7.png

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í),可以輕松些代碼

Snip20160813_9.png

6.指針參數(shù)

6.1 默認(rèn)情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址

6.2 必須是變量,因?yàn)樾枰趦?nèi)部改變其值

6.3 Swift提供的inout關(guān)鍵字就可以實(shí)現(xiàn)

Snip20160813_10.png

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)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容