swift學(xué)習(xí)筆記-OC與swift區(qū)別桃犬,從OC到swift你可以看看這個(gè)

創(chuàng)建對(duì)象

OC:alloc initWith

Swift:(XXX:)

調(diào)用方法

OC:[uicolor redcolor]

Swift:uicolor.redcolor()

枚舉

OC:UIButtonTypeContactAdd

Swift:UIButtonType.ContactAdd

輸出

OC:NSLog(@"Hello, World!");

Swift:2.0開始:? print("Hello, World!")

注釋

* Swift的編譯器將會(huì)在編譯代碼時(shí)自動(dòng)忽略掉注釋部分

*單行注釋//

*多行注釋/**/

與C語(yǔ)言多行注釋不同弟晚,Swift的多行注釋可以嵌套在其它的多行注釋之中嵌套多行注釋

*注釋嵌套/*/**/*/

常量變量

* let常量:常量的值一旦設(shè)定就不能改變

* var變量:變量的值可以隨意更改

*常量&變量的使用原則:

*為保證數(shù)據(jù)的安全性盡量先用let芥炭,只有需要改變的時(shí)候才使用var

常量定義格式

*聲明符號(hào)常量名稱:類型標(biāo)注

* let number: Int

*特點(diǎn):一旦設(shè)定就不能改變

定義變量格式

*聲明符號(hào)常量名稱:類型標(biāo)注

* var number: Int

*特點(diǎn):變量的值可以隨意更改

*注意:一般來(lái)說(shuō)你很少需要寫類型標(biāo)注晴股。如果你在聲明常量或者變量的時(shí)候賦了一個(gè)初始值调榄,Swift可以推斷出這個(gè)常量或者變量的類型

常量和變量的命名

*你可以用任何你喜歡的字符作為常量和變量名踊赠,包括Unicode字符

*常量與變量名不能包含數(shù)學(xué)符號(hào),箭頭振峻,保留的(或者非法的)Unicode碼位臼疫,連線與制表符

*也不能以數(shù)字開頭,但是可以在常量與變量名的其他地方包含數(shù)字

* ...和C和OC一樣, no zuo no die

注意:

*如果你需要使用與Swift保留關(guān)鍵字相同的名稱作為常量或者變量名扣孟,你可以使用反引號(hào)(`)將關(guān)鍵字包圍的方式將其作為名字使用烫堤。

*無(wú)論如何,你應(yīng)當(dāng)避免使用關(guān)鍵字作為常量或變量名凤价,除非你別無(wú)選擇鸽斟。

let??=?"狗"

let?`int` =?88

類型推斷

*編譯器可以在編譯代碼的時(shí)候自動(dòng)推斷出表達(dá)式的類型。(其它語(yǔ)言是沒有類型推斷)

*原理很簡(jiǎn)單利诺,只要檢查你賦的值即可

*如果沒有指定表達(dá)式的類型,也沒有賦予初始值,編譯器會(huì)報(bào)錯(cuò)(type annotation missing in pattern)

//:指定類型

let dValue: Double

dValue = 22.2

print(dValue)

//:不指定類型,利用類型推斷

let num = 10

print(num)

let value = 10.10

print(value)

元祖

*元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值

*將多個(gè)相同或者不同類型的值用一個(gè)小括號(hào)括起來(lái)就是一個(gè)元祖

*元組內(nèi)的值可以是任意類型富蓄,并不要求是相同類型

*作為函數(shù)返回值時(shí),元組非常有用

注意:

*元組在臨時(shí)組織值的時(shí)候很有用慢逾,但是并不適合創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)立倍。如果你的數(shù)據(jù)結(jié)構(gòu)并不是臨時(shí)使用,請(qǐng)使用類或者結(jié)構(gòu)體而不是元組

//定義元祖

let student = ("lnj", 30, 99.8)

//通過下標(biāo)來(lái)訪問元組中的單個(gè)元素

print(student)

print(student.0)

print(student.1)

print(student.2)

//給單個(gè)元素命名

let student1 = (name:"lnj",age:30,score:99.8)

print(student1.name)

print(student1.age)

print(student1.score)

//元組的內(nèi)容分解(decompose)

let (name , age , score) =? ("lnj", 30, 99.8)

print(name)

print(age)

print(score)

類型安全

* Swift是一個(gè)類型安全(type safe)的語(yǔ)言,它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(type checks)侣滩,并把不匹配的類型標(biāo)記為錯(cuò)誤口注。這可以讓你在開發(fā)的時(shí)候盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤

* swift對(duì)數(shù)據(jù)類型要求異常嚴(yán)格, swift中任何時(shí)候,都不會(huì)做`隱式轉(zhuǎn)換`君珠,如果要對(duì)不同類型的數(shù)據(jù)進(jìn)行計(jì)算寝志,必須顯示類型轉(zhuǎn)換

注意:

*結(jié)合數(shù)字類常量和變量不同于結(jié)合數(shù)字類字面量。字面量8可以直接和字面量3.1415926相加,因?yàn)閿?shù)字字面量本身沒有明確的類型材部。它們的類型只在編譯器需要求值的時(shí)候被推測(cè)

* Double和CGFloat也需要轉(zhuǎn)換

let ii = 10

let jj = 10.1

//let sum = ii + jj //錯(cuò)誤寫法

let sum = Double(ii) + jj

print(sum)

//注意:Double()并不會(huì)修改intValue的值,而是通過intValue的值生成一個(gè)臨時(shí)的值賦值給doubleValue

print(ii)

// Double和CGFloat也需要轉(zhuǎn)換

let size = CGSize(width: 10, height: 10)

let res = size.width + CGFloat(dValue)

流程控制結(jié)構(gòu)

Swift提供了類似C語(yǔ)言的流程控制結(jié)構(gòu)(if/switch/for/while/dowhile)

分支if

*只能以Bool作為條件語(yǔ)句

*條件語(yǔ)句不需要加()

* {}不能省略

* Swift中if分支的模式可以使用where語(yǔ)句來(lái)判斷額外的條件

*其它和OCif一樣

let intValue = 10

if intValue > 5{

print("OK")

}

let testValue: Int? = 10

if let d = testValue where testValue > 9

{

print("滿足")

}

Bool類型

* C語(yǔ)言和OC并沒有真正的Bool類型

* OC語(yǔ)言的Bool類型YES/NO是`typedef signed char BOOL;`非0即真

Swift引入了真正的Bool類型true/false

* Swift中沒有C和OC中非零即真的概念

* Swfit中邏輯值只有兩個(gè)true/false

*如果你在需要使用Bool類型的地方使用了非布爾值毫缆,Swift的類型安全機(jī)制會(huì)報(bào)錯(cuò)

//if intValue = 10 { //可能將判斷寫錯(cuò), Swift有效的避免了這種情況

if intValue == 10 {

print(intValue)

}

三目運(yùn)算符

*三目運(yùn)算符的特殊在于它是有三個(gè)操作數(shù)的運(yùn)算符,它簡(jiǎn)潔地表達(dá)根據(jù)問題成立與否作出二選一的操作

*格式:問題?答案1 :答案2

提示:

* Swift中三目運(yùn)算符用得很多

注意:

*過度使用三目運(yùn)算符會(huì)使簡(jiǎn)潔的代碼變的難懂。我們應(yīng)避免在一個(gè)組合語(yǔ)句中使用多個(gè)三目運(yùn)算符

let result = intValue > 20 ? 20 : 10

分支Switch

* OC中case后面必須加上break否則會(huì)貫穿, Swift不用

* Swift中如果想貫穿必須使用fallthrough

* OC中可以不寫default,Swift中只有滿足所有條件才能忽略default

* OC中default位置可以隨便放,Swift不可以

* OC中在case中定義變量需要加大括號(hào),否則作用域混亂, Swift不用加大括號(hào)

* Swift中的switch可以判斷區(qū)間和元祖

* Swift中case分支的模式可以使用where語(yǔ)句來(lái)判斷額外的條件

注意:

Swift中每一個(gè)case分支都必須包含至少一條語(yǔ)句,不像C語(yǔ)言里的switch語(yǔ)句乐导,在Swift中苦丁,switch語(yǔ)句不會(huì)同時(shí)匹配多個(gè)條件

var rank = "A"

switch rank{

//default:

//? ? print("沒有評(píng)級(jí)")

case "A", "B":

var num = 10

print("優(yōu)")

fallthrough

case "C":

print("差")

default:

print("沒有評(píng)級(jí)")

}

匹配區(qū)間

*閉區(qū)間操作符...包含頭包含尾

*半開區(qū)間操作符..<包含頭不包含尾

var age1 = 10

switch age1 {

case 0:

print("0")

case 1..<18:

print("未成年")

case 18..<30:

print("成年")

default:

print("老年人")

}

//:匹配元祖

var point = (50, 50)

switch point{

//只有where后面的條件表達(dá)式為真才賦值并執(zhí)行case后的語(yǔ)句

case (0, 0):

print("原點(diǎn)")

case (50, 50):

print("中點(diǎn)")

default:

print("Other")

}

//:值綁定(Value Bindings)

switch point{

//只有where后面的條件表達(dá)式為真才賦值并執(zhí)行case后的語(yǔ)句

case var(x, y) where x > y:

print("\(x) > \(y)")

case var(x, y) where x < y:

print("\(x) < \(y)")

default:

print("Other")

}

可選類型

*可選類型表示變量可以有值,也可以沒有值

* C和Objective-C中并沒有可選類型這個(gè)概念

* Swift中只有可選類型才可以賦值為nil

*如果你聲明一個(gè)可選常量或者變量但是沒有賦值,它們會(huì)自動(dòng)被設(shè)置為nil

*格式: Optional<類型>或在類型后面加上?號(hào)

可選類型的取值是一個(gè)枚舉

* None沒有值

* Some有值

*由于可選類型在Swift中隨處可見,所以系統(tǒng)做了一個(gè)語(yǔ)法糖,在類型后面加上?

注意:

* nil不能用于非可選的常量和變量兽叮。如果你的代碼中有常量或者變量需要處理值缺失的情況芬骄,請(qǐng)把它們聲明成對(duì)應(yīng)的可選類型。

* Swift的nil和Objective-C中的nil并不一樣鹦聪。在Objective-C中账阻,nil是一個(gè)指向不存在對(duì)象的指針,所以O(shè)bjective-C只有對(duì)象類型才能被設(shè)置為nil(基本類型不行)。在Swift中泽本,nil不是指針——它是一個(gè)確定的值淘太,用來(lái)表示值缺失。任何類型的可選狀態(tài)都可以被設(shè)置為nil规丽,不只是對(duì)象類型蒲牧。

var doubleValue1: Optional = 10.10

var intValue1: Int? = 0

intValue1 = nil

強(qiáng)制解析(forced unwrapping)

let url = NSURL(string: "http://www.520it.com/")

//如果強(qiáng)制解析OptionalValue,但是OptionalValue中沒有值時(shí)會(huì)引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤

print(url!)

//需要考慮url是否有值

if url != nil{

let request = NSURLRequest(URL: url!)

}

可選綁定(optional binding)

*不需要考慮url是否有值,能進(jìn)入{}一定有值

*不僅可以用來(lái)判斷可選類型中是否有值,同時(shí)可以將可選類型中的值賦給一個(gè)常量或者變量

*可選綁定可以用在if和while語(yǔ)句中

提示:

*在實(shí)際開發(fā)中赌莺,使用頻率很高

if let url3 = NSURL(string: "http://www.520it.com/"){

let request = NSURLRequest(URL: url3)

}

隱式解析可選類型(implicitly unwrapped optionals)

*有時(shí)候在程序架構(gòu)中冰抢,第一次被賦值之后,可以確定一個(gè)可選類型_總會(huì)_有值艘狭。在這種情況下挎扰,每次都要判斷和解析可選值是非常低效的,因?yàn)榭梢源_定它總會(huì)有值

*隱式解析可選類型,并不需要每次都使用解析來(lái)獲取可選值,一個(gè)隱式解析可選類型其實(shí)就是一個(gè)普通類型巢音,但是可以被當(dāng)做非可選類型來(lái)使用

*格式:將可選類型后面的?改為!

* let xmgButton: UIButton!

注意:

*如果一個(gè)變量之后可能變成nil的話請(qǐng)不要使用隱式解析可選類型遵倦。如果你需要在變量的生命周期中判斷是否是nil的話,請(qǐng)使用普通可選類型

let url3: NSURL? = NSURL(string: "http://www.520it.com/")

let url4: NSURL! = NSURL(string: "http://www.520it.com/")

print(url3!) //需要驚嘆號(hào)來(lái)獲取值

print(url4)? //不需要感嘆號(hào)

循環(huán)

for循環(huán)-傳統(tǒng)

* for后的圓括號(hào)可以省略

*只能以bool作為條件語(yǔ)句

*如果只有條指令for后面的大括號(hào)`不可以`省略

* for后面的三個(gè)參數(shù)都可以省略,如果省略循環(huán)保持語(yǔ)句,那么默認(rèn)為真

for var i = 0; i < 10; i += 1

{

print(i)

}

for循環(huán)-Swift

*閉區(qū)間:包含區(qū)間內(nèi)所有值a...b例如: 1...5

*半閉區(qū)間:包含頭不包含尾a..

//? 0~9之間

for i in 0..<10

{

print(i)

}

// 0~10

for i in 0...10

{

print(i)

}

忽略_

*不關(guān)心下標(biāo)可以使用_忽略下標(biāo)

*在Swift中_使用非常廣泛

for _ in 0...10

{

print("lnj")

}

while循環(huán)

//: while循環(huán),每次在循環(huán)開始時(shí)計(jì)算條件是否符合

var n = 0

while n < 10

{

print(n)

n += 1

}

//: repeat-while,每次在循環(huán)結(jié)束時(shí)計(jì)算條件是否符合

var m = 0

repeat{

print(m)

m += 1

}while m < 10

數(shù)組(有序數(shù)據(jù)集)

* Swift的Array類型被橋接到Foundation的NSArray類官撼。

*格式: [] / [Int]() / Array()

* let不可變數(shù)組

* var可變數(shù)組

注意:

*不需要改變集合的時(shí)候創(chuàng)建不可變集合是很好的實(shí)踐梧躺。如此Swift編譯器可以優(yōu)化我們創(chuàng)建的集合。

//創(chuàng)建一個(gè)空數(shù)組

var arrayM5: [String] = []

var arrayM4 = [String]()

var arrayM6 = Array()

//創(chuàng)建一個(gè)帶有默認(rèn)值的數(shù)組

let array1 = ["lnj", "lmj"]

let array2 = Array(count: 5, repeatedValue: 0)

//遍歷

for item in array1{

print(item)

}

//遍歷同時(shí)拿到索引

for (index, item) in array1.enumerate()

{

print("index = \(index), item \(item)")

}

//獲取元素

array1[0]

array1[1]

//添加元素

//不能像不可變數(shù)組中添加內(nèi)容

//array1.append("why")

// let不可變對(duì)象, var可變對(duì)象

var arrayM = ["lnj", "lmj"]

arrayM.append("why")

//數(shù)組可以存放任意類型

var arrayM2 = ["lnj", "lmj", 123]

arrayM2.append("456")

//如果需要添加其它類型必須提前聲明為AnyObject

//arrayM.append(123)

//合并數(shù)組

var arrayM3 = ["zs", "ls", "ww", "zl"]

arrayM += arrayM3

//只有相同類型的數(shù)組才可以合并

//arrayM2 += arrayM3

print(arrayM.count)

//和區(qū)間搭配使用

arrayM += arrayM3[0...2]

print(arrayM.count)

//刪除

arrayM3.removeAtIndex(1)

arrayM3

//刪除所有

//arrayM3.removeAll()

//和區(qū)間搭配使用

//arrayM3.removeRange(Range(start: 0, end: 2))

arrayM3.removeRange(0..<2) //其實(shí)Range就是半閉區(qū)間

arrayM3

//刪除并保留容量

arrayM3.removeAll(keepCapacity: true)

arrayM3.capacity

arrayM3.append("1")

arrayM3.capacity

arrayM3.append("2")

arrayM3.capacity

arrayM3.append("3")

arrayM3.capacity

arrayM3.append("4")

arrayM3.capacity

arrayM3.append("5")

//超過容量,容量會(huì)直接*2

arrayM3.capacity

字典(無(wú)序數(shù)據(jù)集)

* Swift的Dictionary類型被橋接到Foundation的NSDictionary類傲绣。

*格式[:] / Dictionary

* let不可變字典

* var可變字典

注意:

*一個(gè)字典的Key類型必須遵循Hashable協(xié)議

//創(chuàng)建一個(gè)空字典

var dict3: [String: AnyObject]

dict3 = [:]

var dict4 = [String: AnyObject]()

//創(chuàng)建一個(gè)帶有默認(rèn)值字典

var dict5 = ["name": "lnj", "age": 30]

//最常見的字典類型[String : AnyObject],例如JSON

var dict = ["name":"lnj", "age": 30]

//遍歷字典

// k,v可以隨便寫,前面是key后面是value

for (k, v) in dict{

print(k)

print(v)

}

//獲取元素

dict["name"]

//添加元素

//如果key不存在會(huì)新增

dict["gender"] = "man"

dict

//替換元素

//如果key存在會(huì)替換

dict["name"] = "why"

//刪除元素

dict.removeValueForKey("name")

dict

//合并字典

var dict2 = ["score": 123]

for (k, v) in dict2{

dict[k] = v

}

dict

字符串

* Swift的String類型與Foundation NSString類進(jìn)行了無(wú)縫橋接

* OC語(yǔ)言中的字符串也是以\0結(jié)尾, Swift不是

* OC中字符串是一個(gè)對(duì)象, Swift中使用String是一個(gè)結(jié)構(gòu)體,效率更高,支持遍歷

注意

* Swift的String類型是值類型掠哥。如果您創(chuàng)建了一個(gè)新的字符串,那么當(dāng)其進(jìn)行常量秃诵、變量賦值操作龙致,或在函數(shù)/方法中傳遞時(shí),會(huì)進(jìn)行值拷貝顷链。任何情況下,都會(huì)對(duì)已有字符串值創(chuàng)建新副本,并對(duì)該新副本進(jìn)行傳遞或賦值操作

// Swift字符串不是以\0結(jié)尾

var stringValue = "abc\0bcd"

print(stringValue)

//遍歷字符串

var str = "南哥很帥"

for c in str.characters

{

print(c)

}

//連接字符串和字符

var str2 = "cool"

str2 += str

let myAge:Int? = 30

let myName = "lnj"

//字符串插值

//拼接字符串的時(shí)如果字符串是可選內(nèi)心嗤练,要特別注意榛了,會(huì)帶上Optional

let str3 = "name = \(myName), age = \(myAge!)"

//需要格式的時(shí)候,怎么辦00:00:00

let frmStr = String(format: "%02d:%02d:%02d", arguments: [9, 23, 8])

//字符串截取,建議使用NSString

let str4 = "xmgcool"

let nsStr: NSString = str4

let subStr = nsStr.substringWithRange(NSMakeRange(0, 3))

//使用startIndex屬性可以獲取一個(gè)String的第一個(gè)Character的索引

//使用endIndex屬性可以獲取最后一個(gè)Character的后一個(gè)位置的索引

let subStr2 = str4.substringToIndex(str4.startIndex.advancedBy(3))

let range = Range(start: str4.startIndex, end: str4.startIndex.advancedBy(3))

let subStr3 = str4.substringWithRange(range)

函數(shù):

*函數(shù)是用來(lái)完成特定任務(wù)的獨(dú)立的代碼塊煞抬。你給一個(gè)函數(shù)起一個(gè)合適的名字霜大,用來(lái)標(biāo)識(shí)函數(shù)做什么,并且當(dāng)函數(shù)需要執(zhí)行的時(shí)候革答,這個(gè)名字會(huì)被用于“調(diào)用”函數(shù)

*格式:

* func函數(shù)名稱(參數(shù)名:參數(shù)類型,參數(shù)名:參數(shù)類型...) ->函數(shù)返回值{函數(shù)實(shí)現(xiàn)部分}

沒有參數(shù)沒有返回值

1.可以寫為->Void

2.可以寫為->()

3.可以省略

* Void战坤。它其實(shí)是一個(gè)空的元組(tuple),沒有任何元素残拐,可以寫成()

func say() -> Void{

print("lnj")

}

say()

func say2() -> (){

print("lnj")

}

say2()

func say3(){

print("lnj")

}

say3()

有參數(shù)沒有返回值

內(nèi)部/外部參數(shù)

*內(nèi)部參數(shù): Swift2.0以前,默認(rèn)情況下的參數(shù)都是內(nèi)部參數(shù)

*? ? ? ? ? Swift2.0開始,默認(rèn)將第二個(gè)參數(shù)名稱作為外部參數(shù)

*外部參數(shù)只能外部用,函數(shù)內(nèi)部不能使用,函數(shù)內(nèi)部只能使用內(nèi)部參數(shù)

*忽略外部參數(shù):在內(nèi)部參數(shù)前加_

func sum(a: Int, b: Int){

print(a + b)

}

sum(10, b: 20)

func summ(a: Int, _ b: Int){

print(a + b)

}

summ(10, 20)

// xy外部參數(shù), ab內(nèi)部參數(shù)

// Swift2.0以前可以寫#

func sum2(x a: Int, y b: Int){

print(a + b)

}

sum2(x: 10, y: 20)

默認(rèn)參數(shù)(Default Parameter Values)

*格式: func method(parameter: Int = 0){}

*當(dāng)默認(rèn)值被定義后途茫,調(diào)用這個(gè)函數(shù)時(shí)可以忽略這個(gè)參數(shù)

*其它語(yǔ)言的默認(rèn)參數(shù)必須寫在最后面, Swift可以寫在任意位置

注意

*將帶有默認(rèn)值的參數(shù)放在函數(shù)參數(shù)列表的最后。這樣可以保證在函數(shù)調(diào)用時(shí)溪食,非默認(rèn)參數(shù)的順序是一致的囊卜,同時(shí)使得相同的函數(shù)在不同情況下調(diào)用時(shí)顯得更為清晰。

func joinString(s1:String , jioner:String = "??",toString s2:String) ->String

{

return s1 + jioner + s2;

}

joinString("lnj", jioner: "和", toString: "xmg")

joinString("lnj", toString: "xmg")

常量參數(shù)和變量參數(shù)(Constant and Variable Parameters)

*函數(shù)參數(shù)默認(rèn)是常量,在函數(shù)內(nèi)部不能修改

*如果想在函數(shù)中修改參數(shù),必須在參數(shù)前加上var

注意

*對(duì)變量參數(shù)所進(jìn)行的修改在函數(shù)調(diào)用結(jié)束后便消失了错沃,并且對(duì)于函數(shù)體外是不可見的栅组。變量參數(shù)僅僅存在于函數(shù)調(diào)用的生命周期中

func swap(var a:Int, var b:Int)

{

print("交換前a = \(a) b = \(b)")

let temp = a;

a = b;? //可以修改,但不會(huì)影響實(shí)參

b = temp;

print("交換后a = \(a) b = \(b)")

}

var x = 10

var y = 20

print("交換前a = \(x) b = \(y)")

swap(x, b: y)

print("交換后a = \(x) b = \(y)")

輸入輸出參數(shù)(In-Out Parameters)

*變量參數(shù),正如上面所述枢析,僅僅能在函數(shù)體內(nèi)被更改玉掸。如果你想要一個(gè)函數(shù)可以修改參數(shù)的值,并且想要在這些修改在函數(shù)調(diào)用結(jié)束后仍然存在醒叁,那么就應(yīng)該把這個(gè)參數(shù)定義為輸入輸出參數(shù)(In-Out Parameters)

*定義一個(gè)輸入輸出參數(shù)時(shí)司浪,在參數(shù)定義前加inout關(guān)鍵字

注意

*輸入輸出參數(shù)不能有默認(rèn)值,而且可變參數(shù)不能用inout標(biāo)記辐益。如果你用inout標(biāo)記一個(gè)參數(shù)断傲,這個(gè)參數(shù)不能被var或者let標(biāo)記。

func swap2(inout a:Int, inout b:Int)

{

let temp = a;

a = b;

b = temp;

}

var x1 = 10;

var y1 = 20;

print("交換前a = \(x1) b = \(y1)")

swap2(&x1, b: &y1)

print("交換后a = \(x1) b = \(y1)")

可變參數(shù)(Variadic Parameters)

*一個(gè)可變參數(shù)可以接收零個(gè)或多個(gè)值

*如果沒有變參函數(shù),并且函數(shù)的參數(shù)個(gè)數(shù)又不確定那么只能寫多個(gè)方法或者用將函數(shù)參數(shù)改為集合

*格式func method(parameter: Int...){}

*可變參數(shù)在函數(shù)中可以當(dāng)做一個(gè)數(shù)組

注意

*一個(gè)函數(shù)最多只能有一個(gè)可變參數(shù)

*變參只能是同種類型的數(shù)據(jù)

*變參必須指定數(shù)據(jù)類型

*如果函數(shù)有一個(gè)或多個(gè)帶默認(rèn)值的參數(shù)智政,而且還有一個(gè)可變參數(shù)认罩,那么把可變參數(shù)放在參數(shù)表的最后

func add(nums:Int..., other:Int) -> Int

{

var sum = 0;

for num in nums

{

sum += num

}

return sum + other

}

print(add(1, 2, 3, other: 9))//會(huì)將99傳遞給第一個(gè)參數(shù),后面的傳遞給nums

//沒有參數(shù)有返回值

func getNumer() ->Int{

return 998

}

print(getNumer())

//有參數(shù)有返回值

func sum3(a: Int, b: Int) ->Int{

return a + b

}

print(sum3(10, b: 20))

//嵌套函數(shù)

func showArray(array:[Int])

{

//嵌套函數(shù)

func printArray(arr:[Int])

{

for number in array

{

print("\(number), ")

}

}

printArray(array)

}

showArray([1, 3, 5, 7, 9])

函數(shù)類型(Function Types)

*函數(shù)類型作為參數(shù)類型(Function Types as Parameter Types)

*函數(shù)類型作為返回類型(Function Types as Return Types)

*嵌套函數(shù)(Nested Functions)

提前退出

*像if語(yǔ)句一樣,guard的執(zhí)行取決于一個(gè)表達(dá)式的布爾值续捂。我們可以使用guard語(yǔ)句來(lái)要求條件必須為真時(shí)垦垂,以執(zhí)行g(shù)uard語(yǔ)句后的代碼。

*如果guard語(yǔ)句的條件被滿足牙瓢,則在保護(hù)語(yǔ)句的封閉大括號(hào)結(jié)束后繼續(xù)執(zhí)行代碼

*任何使用了可選綁定作為條件的一部分并被分配了值的變量或常量對(duì)于剩下的保護(hù)語(yǔ)句出現(xiàn)的代碼段是可用的

*如果條件不被滿足劫拗,在else分支上的代碼就會(huì)被執(zhí)行。

* else這個(gè)分支必須轉(zhuǎn)移控制以退出guard語(yǔ)句出現(xiàn)的代碼段矾克。它可以用控制轉(zhuǎn)移語(yǔ)句如return,break,continue或者throw做這件事

func divide3(dividend: Double?, divisor: Double?) -> Double? {

guard let dividend = dividend else {

return .None

}

guard let divisor = divisor else {

return .None

}

guard divisor != 0 else {

return .None

}

return dividend / divisor

}

print(divide3(10, divisor: 20))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末页慷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酒繁,老刑警劉巖滓彰,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異州袒,居然都是意外死亡揭绑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門郎哭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)他匪,“玉大人,你說(shuō)我怎么就攤上這事夸研“蠲郏” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵陈惰,是天一觀的道長(zhǎng)畦徘。 經(jīng)常有香客問我,道長(zhǎng)抬闯,這世上最難降的妖魔是什么井辆? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮溶握,結(jié)果婚禮上杯缺,老公的妹妹穿的比我還像新娘。我一直安慰自己睡榆,他們只是感情好萍肆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胀屿,像睡著了一般塘揣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宿崭,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天亲铡,我揣著相機(jī)與錄音,去河邊找鬼葡兑。 笑死奖蔓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讹堤。 我是一名探鬼主播吆鹤,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洲守!你這毒婦竟也來(lái)了疑务?” 一聲冷哼從身側(cè)響起沾凄,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎知允,沒想到半個(gè)月后搭独,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廊镜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唉俗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗤朴。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虫溜,靈堂內(nèi)的尸體忽然破棺而出雹姊,到底是詐尸還是另有隱情,我是刑警寧澤衡楞,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布吱雏,位于F島的核電站,受9級(jí)特大地震影響瘾境,放射性物質(zhì)發(fā)生泄漏歧杏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一迷守、第九天 我趴在偏房一處隱蔽的房頂上張望犬绒。 院中可真熱鬧,春花似錦兑凿、人聲如沸凯力。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咐鹤。三九已至,卻和暖如春圣絮,著一層夾襖步出監(jiān)牢的瞬間祈惶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工晨雳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留行瑞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓餐禁,卻偏偏與公主長(zhǎng)得像血久,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帮非,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容