Swift與OC的語法簡單對比(常用語法一)

01-常量與變量


學習swift第一步打印Hello World

print("Hello World")

swift是不用加分號的

什么是常量?

常量是在程序運行過程中不能改變值的量

什么時變量?

變量是可以在程序運行過程中不斷變化的量

在swift當中常量和變量必須在使用前聲明

用let來聲明常量,用var來聲明變量

常量定義方式:

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

常量與變量名不能包含以下:

數(shù)學符號娘扩,箭頭泼差,保留的(或者非法的)Unicode碼位,連線與制表符。

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

注意:Swift中的常量必須在定義時初始化(OC可以不初始化),否則會報錯

letmax=10

let??=100

變量定義方式:

在OC當中先定義再初始化————>(以下為OC寫法)

intage;

age =10;

也可以定義的同時初始化

intage =10;

在swift當中先定義再初始化:

varage 這種寫法會直接報錯.

報錯原因:(type annotation missing in pattern:沒有指定數(shù)據(jù)類型)

在Swift中如果想要先定義一個變量,

以后使用時再初始化必須在定義時告訴編譯器變量的類型(類型標注)

寫法為:

varage:Int

age = 20

定義的同時初始化:

在Swift中如果定義的同時初始化一個變量,可以不用寫數(shù)據(jù)類型

編譯期會根據(jù)初始化的值自動推斷出變量的類型(類型推斷機制)

varage:Int=20

varage =20


02-基本數(shù)據(jù)類型


基本數(shù)據(jù)類型

OC:

整型int intValue = 10;

浮點型double doubleValue = 10.10; float floatValue = 5.1;

長long

短short

有符號signed

無符號unsigned

各種類型的數(shù)據(jù)的取值范圍在不同位的編譯器下取值范圍不同

Swift:注意關(guān)鍵字大寫

整型

varintValue:Int=10

浮點型

varintValue1:Double=10.10表示64位浮點數(shù)

varintValue2:Float=9.9表示32位浮點數(shù)

如果按照長度劃分,Swift中的長短比OC更加精確

varintValue3:Int8=6

varintValue4:Int16=7

varintValue5:Int32=8

varintValue6:Int64=9

有符號無符號,默認是有符號的(UInt8/UInt16/UInt32/UInt64)

varuintValue7:UInt=10

注意:無符號的數(shù)比有符號的取值范圍更大,因為符號位也用來存值

Swift是類型安全的語言,如果取值錯誤會直接報錯,而OC不會

取值不對

OC:unsignedintintValue = -10;不會報錯

Swift:varintValue:UInt= -10會報錯

溢出:

OC:intintValue =INT_MAX+1;不會報錯

Swift:varintValue:UInt=UInt.max +1會報錯

數(shù)據(jù)類型的相互賦值(隱式類型轉(zhuǎn)換)

OC可以隱式類型轉(zhuǎn)換

intintValue =10;

doubledoubleValue = intValue;

Swift:不具有隱式類型轉(zhuǎn)換

在Swift中“值永遠不會被隱式轉(zhuǎn)換為其他類型”(OC中可以隱式類型轉(zhuǎn)換)

以下語句會報錯

varintValue:Int=10

vardoubleValue:Double= intValue

數(shù)據(jù)類型轉(zhuǎn)換

Swift不允許隱式類型轉(zhuǎn)換,但可以使用顯示類型轉(zhuǎn)換(強制類型轉(zhuǎn)換)

OC寫法

intintValue =10;

doubledoubleValue = (double)intValue;

Swift寫法:

varintValue:Int=10

vardoubleValue:Double

doubleValue=Double(intValue)

注意:Double()并不會修改intValue的值

而是通過intValue的值生成一個臨時的值賦值給doubleValue

print(intValue)

print(doubleValue)


03- 運算符


算術(shù)運算符:

+ - * / % ++ --

除了取模,其它和OC一樣,包括優(yōu)先級

varresult =10+10

result =10*10

result =10-10

result =10/10

print(result)

注意:Swift是安全嚴格的編程語言,會在編譯時候檢查是否溢出

但是只會檢查字面量而不會檢查變量

所以在Swift中一定要注意隱式溢出

遇到這種問題可以利用溢出運算符解決該問題:

http://www.yiibai.com/swift/overflow_operators.html

取模%

OC:只能對整數(shù)取模

NSLog(@"%tu",10%3);

Swift:支持小數(shù)取模

print(10%3.5)

自增自減

varnumber =10

number++

print(number)

number--

print(number)

賦值運算

varnum1 =10

num1 =20

num1 +=10

num1 -=10

num1 /=10

num1 *=10

num1 %=5

print(num1)

基本用法和OC一樣,唯一要注意的是表達式的值

OC:表達式的結(jié)合方向是從左至右

整個表達式的值整體的值等于最后一個變量的值,簡而言之就是連續(xù)賦值

寫法為:

intnum1;

intnum2;

num2 = num1 =10;

NSLog(@"%d",num2);

Swift:不允許連續(xù)賦值, Swift中的整個表達式是沒有值的.

主要是為了避免if (c == 9)

這種情況誤寫為if (c = 9) ,c = 9是一個表達式,表達式是沒有值的

所以在Swift中if (c = 9)不成立

下面這個寫法是在swift當中不允許的

varnum1:Int

varnum2:Int

num2 = num1 =10

關(guān)系運算符

> < >= <= == != ?:

關(guān)系運算符,得出的值是Bool值,基本用法和OC一樣

varresult1:Bool=250>100

varresult2 =250>100?250:100

print(result2)

邏輯運算符

C語言和OC并沒有真正的Bool類型

C語言的Bool類型非0即真

OC語言的Bool類型是typedef signed char BOOL;

Swift引入了真正的Bool類型

Bool true false

Swift中if的條件只能是一個Bool的值或者是返回值是Bool類型的表達式

OC中if可以是任何整數(shù)(非0即真),

但是存在的問題是可能將判斷寫錯,寫成了賦值if(isOpen = 2)

在開發(fā)中為了避免這個問題

有經(jīng)驗的程序員會這樣寫if(2 == isOpen)來避免這個問題.

在Swift中很好的解決了這個問題

邏輯運算符在swift當中只能操作Bool類型數(shù)據(jù)

在OC當中是非0即真.可以操作整形

在swift當中不允許這種操作.其它基本和OC一致

varopen =false

if!open

{

print("打開")

}

varage =20

varheight =180

varwage? =30000

if(age >25&& age <40&& height >175) || wage >20000

{

print("恒仔")

}

區(qū)間

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

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

注意: 1.Swift剛出來時的寫法是a..b

2.區(qū)間只能用于整數(shù),寫小數(shù)會有問題

foriin1...5

{

print(i)

}

foriin1..<5

{

print(i)

}


04- 元組


什么是元組

在其它語言中很早就是有元組這個概念,但是對于OC程序員來說這是一個新的概念

官方定義:元組(tuples)把多個值組合成一個復合值报辱。

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

將多個相同或者不同類型的值用一個小括號括起來就是一個元組

定義元組

letstudent = ("lzh",30,99.8)

print(student)

print(student.0)

print(student.1)

print(student.2)

元組其實和結(jié)構(gòu)體很像,只是不需要提前定義類型.

元組其實是復合類型,小括號中可以寫任意類型

也可以指定數(shù)據(jù)類型

如果指定了數(shù)據(jù)類型,那么對應(yīng)的必須是其它定的數(shù)據(jù)類型,否則會報錯.

letstudent: (String,Int,Double) = ("lzh",30,99.8)

定義元組其它方式

指明元組元素的名稱

letstudent = (name:"lzh",age:30,score:99.8)

print(student.name)

print(student.age)

print(student.score)

通過指定的名稱提取元組對應(yīng)的值,會將對應(yīng)位置的值賦值給對應(yīng)位置的名稱

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

print(name)

print(age)

print(score)

如果不關(guān)心元組中的某個值可以利用_通配符來忽略提取

letstudent = ("lzh",10,20)

let(name , age ,_) = student

print(name)

print(age)

在以前沒有元組之前C和OC語言是通過傳入指針或者返回結(jié)構(gòu)體的方式來返回多個值的

而有了元組之后就可以實現(xiàn)讓一個函數(shù)返回多個值


05- 可選值

使用可選類型(optionals)來處理值可能缺失的情況碍现。

C 和 Objective-C 中并沒有可選類型這個概念幅疼。

最接近的是 Objective-C 中的一個特性,

一個方法要不返回一個對象要不返回nil鸵赫,nil表示“缺少一個合法的對象”

可選值: optionals有兩種狀態(tài):

1.有值

2.沒有值,沒有值就是nil

?表示兩種狀態(tài),一種是有值(有具體的某個值)

一種是沒有值(沒有代表為nil)

當為?修飾時,表明這個變量有可能為nil

有值

varoptValue:Int? =9

沒有值

varoptValue:Int?

varoptValue:Int? =nil

可選值可以利用if語句來進行判斷

varoptValue:Int? =10

ifoptValue !=nil

{

print("有值:\(optValue)")

}else

{

print("沒有值:\(optValue)")

}

輸出結(jié)果:有值:Optional(10)

varoptValue:Int?

ifoptValue !=nil

{

print("有值:\(optValue)")

}else

{

print("沒有值:\(optValue)")

}

輸出結(jié)果:沒有值:nil

varoptValue:Int?=nil

ifoptValue !=nil

{

print("有值:\(optValue)")

}else

{

print("沒有值:\(optValue)")

}

輸出結(jié)果:沒有值:nil

提取可選類型的值(使用!強制解析)

將optValue中的整型值強制拿出來賦值給變量result,

換句話說就是告訴編譯器optValue一定有值

因為可選類型有兩種狀態(tài)有值和沒有值,所以需要告訴編譯器到底有沒有值

需要注意的是如果強制解析optValue

但是optValue中沒有值時會引發(fā)一個運行時錯誤

varoptValue:Int? =9

varresult:Int=optValue!

print(result)

輸出結(jié)果:9

varoptValue6:Int?

varresult2:Int=optValue6!

print(result2)

結(jié)果為報錯:

fatal error:

unexpectedly found nil while unwrapping an Optional value

可選綁定

為了更安全的解析可選類型的值,一般情況下使用可選綁定

如果optValue沒有值就不會做任何操作

如果optValue有值會返回true并將optValue的值賦值給result執(zhí)行大括號中的內(nèi)容

varoptValue:Int? =9

ifletresult =optValue

{

print(result)

}


06-字符和字符串


字符

OC當中的字符:charcharValue ='a';

swift當中的字符:varcharValue1:Character="a"

Swift和OC字符不一樣

1.Swift是用雙引號

2.Swift中的字符類型和OC中的也不一樣

OC中的字符占一個字節(jié),因為它只包含ASCII表中的字符

而Swift中的字符除了可以存儲ASCII表中的字符還可以存儲unicode字符.

OC的字符是遵守ASCII標準的,Swift的字符是遵守unicode標準的

所以可以存放時間上所有國家語言的字符(大部分)

OC當中:charcharValue ='李’;錯誤

swift當中:varcharValue2:Character="李"正確

注意:雙引號中只能放一個字符,如下是錯誤寫法

varcharValue3:Character="ab"

字符串

C:

char*stringValue ="ab";

charstringArr ="ab";

OC:

NSString*stringValue ="ab";

Swift:

varstringValue1 ="ab"

C語言中的字符串是以\0結(jié)尾的,例如:

char*stringValue ="abc\0bcd";

printf("%s", stringValue);

輸出結(jié)果:abc

OC語言中的字符串也是以\0結(jié)尾的,例如:

NSString*stringValue =@"abc\0bcd";

NSLog(@"%@", stringValue);

swift當中的字符串和C語言/OC語言中的字符串是不一樣的

varstringValue ="abc\0bcd"

print(stringValue)

輸入結(jié)果:abcbcd

字符串常用方法

計算字符串長度:

C:

char*stringValue ="abc李";

printf("%tu",strlen(stringValue));

輸出結(jié)果:6

OC:

NSString*stringValue =@"abc李";

NSLog(@"%tu", stringValue.length);

輸出結(jié)果:4以UTF16計算

swift:

varstringValue ="abc李"

print(stringValue.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))

輸出結(jié)果:6和C語言一樣計算字節(jié)數(shù)

字符串拼接

C:

charstr1[] ="abc";

char*str2 ="bcd";

char*str =strcat(str1, str2);

printf("%s",str);

輸出結(jié)果:abcbcd

OC:

NSMutableString*str1 = [NSMutableStringstringWithString:@"abc"];

NSString*str2 =@"bcd";

[str1appendString:str2];

NSLog(@"%@", str1);

輸出結(jié)果:abcbcd

swift:

varstr1 ="g";

varstr2 ="gxq";

varstr =str1+str2;

print(str)

輸出結(jié)果:ggxq

格式化字符串

OC:

NSString*str =

[NSMutableString

stringWithFormat:@"http://ios.564697292@qq.cn/pic/%tu.png",index];

NSLog(@"%@", str);

輸入結(jié)果:http://ios.564697292@qq.cn/pic/10.png

swift:

varindex =10

varstr ="http://www.564697292@qq.com/pic/\(index).png"

print(str)

輸入結(jié)果:http://www.564697292@qq.com/pic/10.png

字符串比較:

oc:

NSString*str1 =@"abc";

NSString*str2 =@"abc";

if([str1compare:str2] ==NSOrderedSame)

{

NSLog(@"相等");

}else

{

NSLog(@"不相等");

}

輸出結(jié)果:相等

NSString*str1 =@"abc";

NSString*str2 =@"abc";

if([str1isEqualToString:str2])

{

NSLog(@"相等");

}else

{

NSLog(@"不相等");

}

輸出結(jié)果:相等

Swift:(== / != / >= / <=),和C語言的strcmp一樣是逐個比較

varstr1 ="abc";

varstr2 ="abc";

ifstr1 == str2

{

print("相等");

}else

{

print("不相等");

}

輸出結(jié)果:相等

varstr1 ="abd";

varstr2 ="abc";

ifstr1 >= str2

{

print("大于等于");

}else

{

print("不大于等于");

}

輸出結(jié)果:大于等于

判斷前后綴

OC:

NSString*str =@"http://564697292@qq.com";

if([strhasPrefix:@"http"]) {

NSLog(@"是url");

}

if([strhasSuffix:@".cn"]) {

NSLog(@"是頂級域名");

}

輸出結(jié)果:url

是頂級域名

Swift:

varstr ="http://www.564697292@qq.com"

ifstr.hasPrefix("http") {

print("是url");

}

ifstr.hasSuffix(".com") {

print("是頂級域名");

}

輸出結(jié)果:url

是頂級域名

大小寫轉(zhuǎn)換

OC:

NSString*str =@"abc.txt";

NSLog(@"%@", [struppercaseString]);

NSLog(@"%@", [strlowercaseString]);

輸出結(jié)果:ABC.TXT

abc.txt

Swift:

varstr ="abc.txt";

print(str.uppercaseString)

print(str.lowercaseString)

輸出結(jié)果:ABC.TXT

abc.txt

轉(zhuǎn)換為基本數(shù)據(jù)類型

OC:

NSString*str =@"250";

NSIntegernumber = [strintegerValue];

NSLog(@"%tu", number);

輸出結(jié)果:250

如果str不能轉(zhuǎn)換為整數(shù),那么可選類型返回nil

str = "250sb"不能轉(zhuǎn)換所以可能為nil

varstr ="250"

varnumber:Int? =Int(str)

ifnumber !=nil

{

以前的版本println會自動拆包,現(xiàn)在的不會

print(number!)

}


07- 數(shù)組


數(shù)組定義:

OC:

有值數(shù)組

NSArray*arr0 =@[@1,@2,@3];

NSArray*arr1 = [NSArrayarrayWithObjects:@1,@2,@3,nil];

NSLog(@"%@", arr1);

輸出結(jié)果:

2016-01-06 01:04:49.180 test[11687:2096671] (

1,

2,

3

)

空數(shù)組

NSArray*arr =@[];

NSArray*arr1 = [NSArrayarray];

NSLog(@"%@", arr1);

輸出結(jié)果:

2016-01-06 01:06:04.132 test[11703:2106199] (

)

不可變數(shù)組:NSArray

可變數(shù)組:NSMutableArray

swift:

有值數(shù)組

vararr0 = [1,2,3]

vararr1:Array= [1,2,3]

vararr2:Array = [1,2,3]

vararr3: [Int] = [1,2,3]

print(arr3)

輸出結(jié)果:[1, 2, 3]

空數(shù)組

vararr5 = []

vararr6 = [Int]()

vararr7 =Array()

print(arr7)

輸出結(jié)果:[]

可變數(shù)組:

vararr8 = []

不可變數(shù)組:

letarr9? = []

元素類型

OC:

NSArray*arr =@[@1,@"gxq",@130];

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 01:13:07.987 test[11891:2163044] (

1,

gxq,

130

)

swift:

vararr = [1,"gxq",130]

print(arr)

輸出結(jié)果:[1, gxq, 130]

如果想明確表示數(shù)組中存放的是不同類型的數(shù)據(jù)

可以使用Any關(guān)鍵字,表示數(shù)組中可以存放不同類型的數(shù)據(jù)

vararr:Array = [1,"gxq",130]

print(arr)

輸出結(jié)果:[1, gxq, 130]

指定數(shù)組當中只能存放Int型,如果存放其它類型會直接報錯

vararr:Array = [1,10,130]

print(arr)

輸出結(jié)果:[1, 10, 130]



08-數(shù)組操作


獲取長度

OC:

NSArray*arr =@[@1,@2,@3];

NSLog(@"%tu", arr.count);

輸出結(jié)果:2016-01-06 01:19:54.874 test[12086:2209180] 3

swift:

vararr = [1,2,3]

print(arr.count)

輸出結(jié)果:3

判斷是否為空

OC:

NSArray*arr =@[];

NSLog(@"result = %d", arr.count!=0);

輸出結(jié)果:2016-01-06 01:25:14.252 OCTest[12249:2255010] result = 0

swift:

vararr = [1,2,3]

print(arr.isEmpty)

輸出結(jié)果:false

檢索

OC:

NSArray*arr =@[@1,@2,@3];

NSLog(@"%@", arr[0]);

輸出結(jié)果:2016-01-06 01:26:46.816 OCTest[12275:2269853] 1

swift:

vararr = [1,2,3]

print(arr[0])

輸出結(jié)果:1

追加

OC:

NSMutableArray*arr =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arraddObject:@4];

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 01:28:47.111 OCTest[12297:2286198] (

1,

2,

3,

4

)

swift:

vararr = [1,2,3]

arr.append(4);

print(arr)

輸出結(jié)果:[1, 2, 3, 4]

vararr = [1,2,3]

arr+= [4]

print(arr)

輸出結(jié)果:[1, 2, 3, 4]

vararr = [1,2,3]

arr+= [4]

arr+= [5,6,7]

輸出結(jié)果:[1, 2, 3, 4, 5, 6, 7]

vararr = [1,2,3]

arr+= [4]

arr+= [5,6,7]

arr+=arr[0...3]

print(arr)

輸出結(jié)果:[1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4]

插入

OC:

NSMutableArray*arr =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arrinsertObject:@4atIndex:0];

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 01:36:10.450 OCTest[12374:2339079] (

4,

1,

2,

3

)

swift:

vararr = [1,2,3]

arr.insert(4, atIndex:0);

print(arr)

輸出結(jié)果:[4, 1, 2, 3]

更新

OC:

NSMutableArray*arr =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

arr[0] =@8;

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 01:37:28.482 OCTest[12397:2350177] (

8,

2,

3

)

swift:

vararr = [1,2,3]

arr[0] =8

print(arr)

輸出結(jié)果:[8, 2, 3]

刪除

OC:

NSMutableArray*arr1 =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arr1removeObject:@1];

NSLog(@"%@", arr1);

NSMutableArray*arr2 =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arr2removeLastObject];

NSLog(@"%@", arr2);

NSMutableArray*arr3 =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arr3removeAllObjects];

NSLog(@"%@", arr3);

輸出結(jié)果:

2016-01-06 01:39:49.831 OCTest[12418:2370779] (

2,

3

)

2016-01-06 01:39:49.832 OCTest[12418:2370779] (

1,

2

)

2016-01-06 01:39:49.832 OCTest[12418:2370779] (

)

swift:

vararr1 = [1,2,3]

arr1.removeAtIndex(0)

print(arr1)

vararr2 = [1,2,3]

arr2.removeLast()

print(arr2)

vararr3 = [1,2,3]

是否保持容量,如果為true,即便刪除了容量依然存在,容量是2的倍數(shù)

arr3.removeAll(keepCapacity:false)

print(arr3)

print(arr3.capacity)

輸出結(jié)果:

[2, 3]

[1, 2]

[]

0

Range

OC:

NSMutableArray*arr =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

[arrremoveObjectsInRange:NSMakeRange(0,2)];

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 01:43:17.863 OCTest[12441:2396986] (

3

)

swift:

vararr = [1,2,3]

arr.removeRange(Range(start:1, end:2))

print(arr)

輸出結(jié)果:[1, 3]

vararr = [1,2,3]

arr.removeRange(0...0)

print(arr)

輸出結(jié)果:[2, 3]

varrange =0...5

print(range)

輸出結(jié)果:0..<6


09-數(shù)組的批量操作


OC:

NSMutableArray*arr =

[NSMutableArrayarrayWithObjects:@1,@2,@3,nil];

NSRangerange =NSMakeRange(0,2);

[arrreplaceObjectsInRange:range

withObjectsFromArray:@[@99,@88,@77,@66]];

NSLog(@"%@", arr);

輸出結(jié)果:

2016-01-06 14:56:45.493 OCTest[3599:667081] (

99,

88,

77,

66,

3

)

swift:

vararr = [1,2,3]

arr.replaceRange(1..<2, with: [99,88,77,66])

print(arr)

輸出結(jié)果:[1, 99, 88, 77, 66, 3]

vararr = [1,2,3]

arr.replaceRange(Range(start:0, end:2), with: [99,88,77,66])

print(arr)

輸出結(jié)果:[99, 88, 77, 66, 3]

遍歷

OC:

NSArray*arr =@[@1,@2,@3];

for(inti =0; i < arr.count; i++) {

NSLog(@"%@", arr[i]);

}

輸出結(jié)果:

2016-01-06 15:00:10.702 OCTest[3635:694273] 1

2016-01-06 15:00:10.703 OCTest[3635:694273] 2

2016-01-06 15:00:10.703 OCTest[3635:694273] 3

NSArray*arr =@[@1,@2,@3];

for(NSNumber*numberinarr) {

NSLog(@"%@", number);

}

輸出結(jié)果:

2016-01-06 15:03:43.192 OCTest[3684:723081] 1

2016-01-06 15:03:43.193 OCTest[3684:723081] 2

2016-01-06 15:03:43.194 OCTest[3684:723081] 3

swift:

vararr1 = [1,2,3]

forvari =0; i

{

print(arr1[i])

}

fornumberinarr1

{

print(number)

}

輸出結(jié)果:

1

2

3

vararr2 = [1,2,3]

fornumberinarr2[0..<3]

{

print(number)

}

輸出結(jié)果:

1

2

3


10-字典


定義字典

OC:

NSDictionary*dict =[NSDictionarydictionaryWithObject:

@"gxq"forKey:@"name"];

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:09:11.214 OCTest[3773:761032] {

name = gxq;

}

NSDictionary*dict =[NSDictionarydictionaryWithObjectsAndKeys:

@"name",@"gxq",

@"age",@20,nil];

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:13:39.853 OCTest[3831:792730] {

gxq = name;

20 = age;

}

NSDictionary*dict =@{@"name":@"gxq",@"age":@20};

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:14:57.616 OCTest[3841:801710] {

age = 20;

name = gxq;

}

swift:

key一定要是可以hash的(String, Int, Float, Double, Bool)

value沒有要求

vardict = ["name":"gxq","age":20]

print(dict)

vardict1:Dictionary= ["name":"gxq","age":20]

print(dict1)

vardict2:Dictionary = ["name":"gxq","age":20]

print(dict2)

vardict3:[String:AnyObject] = ["name":"gxq","age":20]

print(dict3)

vardict4:[String:AnyObject] =

Dictionary(dictionaryLiteral: ("name","gxq"), ("age",20))

print(dict4)

輸出結(jié)果:

["age": 20, "name": gxq]

["age": 20, "name": gxq]

["age": 20, "name": gxq]

["age": 20, "name": gxq]

["age": 20, "name": gxq]

可變字典:

vardict5 = [:]

不可變字典:

letdict6? = [:]

字典操作

OC:

獲取

NSDictionary*dict =@{@"name":@"gxq",@"age":@20};

NSLog(@"%@", dict[@"name"]);

輸出結(jié)果:

2016-01-06 15:26:00.351 OCTest[3923:881138] gxq

修改

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"name",@"gxq",

@"age",@20,nil];

dict[@"name"] =@"iversion";

NSLog(@"%@", dict[@"name"]);

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"name",@"gxq",

@"age",@20,nil];

[dictsetObject:@"iversion"forKey:@"name"];

NSLog(@"%@", dict[@"name"]);

輸出結(jié)果:

2016-01-06 15:27:01.704 OCTest[3933:890317] iversion

2016-01-06 15:28:21.398 OCTest[3943:899613] iversion

swift:

獲取

vardict = ["name":"gxq","age":20]

print(dict["name"]!)

輸出結(jié)果:gxq

修改

vardict = ["name":"gxq","age":20]

dict["name"] ="iverson"

print(dict["name"]!)

vardict1 = ["name":"gxq","age":20]

dict1.updateValue("iverson", forKey:"name")

print(dict["name"]!)

輸出結(jié)果:

iverson

iverson

更新

updateValue返回一個可選類型

如果字典中不存在需要更新的key,那么返回nil,如果存在返回原始值

vardict = ["name":"gxq","age":25]

ifletorignal =dict.updateValue("iverson", forKey:"name")

{

print(dict["name"]!)

print(orignal)

}

輸出結(jié)果:

iverson

gxq

updateValue返回一個可選類型

如果字典中不存在需要更新的key,那么返回nil并且會將新的鍵值對添加到字典中

vardict = ["name":"gxq","age":25]

ifletorignal =dict.updateValue("iverson", forKey:"abc")

{

print(dict["abc"]!)

print(orignal)

}

print(dict)

輸出結(jié)果:["abc": iverson, "age": 25, "name": gxq]

添加

OC:

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"name",@"gxq",

@"age",@25,nil];

dict[@"height"] =@100;

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:35:11.734 OCTest[4025:946250] {

gxq = name;

25 = age;

height = 100;

}

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"name",@"GXQ",

@"age",@30,nil];

[dictsetObject:@200forKey:@"height"];

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:36:15.768 OCTest[4035:953931] {

GXQ = name;

30 = age;

height = 200;

}

swift:

vardict = ["name":"Gxq","age":50]

dict["height"] =160;

print(dict)

輸出結(jié)果:["height": 160, "age": 50, "name": Gxq]

刪除

OC:

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"lzh",@"name",

@30,@"age",nil];

[dictremoveObjectForKey:@"name"];

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:40:37.801 OCTest[4058:981747] {

age = 30;

}

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"lzh",@"name",

@30,@"age",nil];

[dictremoveAllObjects];

NSLog(@"%@", dict);

輸出結(jié)果:

2016-01-06 15:41:20.705 OCTest[4068:989096] {

}

swift:

vardict = ["name":"gxq","age":10]

dict.removeValueForKey("name")

print(dict)

輸出結(jié)果:["age": 10]

removeValueForKey返回一個可選類型

如果字典中不存在需要刪除的key,那么返回nil并且不會執(zhí)行任何操作

如果存在則刪除key對應(yīng)的值,并且返回被刪除的值

vardict = ["name":"gxq","age”:20]

ifletorignal =dict.removeValueForKey("names")

{

print(dict)

print(orignal)

}

print(dict)

輸出結(jié)果:["age": 30, "name": gxq]

vardict = ["name”:"gxq","age":30]

dict.removeAll(keepCapacity:true)

遍歷字典

OC:

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"gxq",@"name",

@40,@"age",nil];[dictenumerateKeysAndObjectsUsingBlock:^(idkey,idobj,BOOL*stop) {

NSLog(@"key = %@ value = %@", key, obj);

}];

輸出結(jié)果:

2016-01-06 15:45:59.810 OCTest[4117:1022823] key = name value = gxq

2016-01-06 15:45:59.811 OCTest[4117:1022823] key = age value = 40

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"gxq",@"name",

@40,@"age",nil];

NSArray*keys = [dictallKeys];

for(NSString*keyinkeys) {

NSLog(@"%@", key);

}

輸出結(jié)果:

2016-01-06 15:48:07.861 OCTest[4137:1039198] name

2016-01-06 15:48:07.862 OCTest[4137:1039198] age

NSMutableDictionary*dict =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

@"gxq",@"name",

@40,@"age",nil];

NSArray*keys = [dictallValues];

for(NSString*keyinkeys) {

NSLog(@"%@", key);

}

輸出結(jié)果:

2016-01-06 15:49:20.375 OCTest[4148:1049548] gxq

2016-01-06 15:49:20.376 OCTest[4148:1049548] 40

vardict1 = ["name":"Gxq","age":30]

for(key , value)indict1

{

print("key =\(key) value =\(value)")

}

輸出結(jié)果:

key = age value = 30

key = name value = Gxq

vardict2 = ["name":"Gxq","age":40]

forkeyindict2.keys

{

print("key =\(key)")

}

輸出結(jié)果:

key = age

key = name

vardict3 = ["name":"Gxq","age":50]

forvalueindict3.values

{

print("value =\(value)")

}

輸出結(jié)果:

value = 50

value = Gxq



11-if語句


if語句基本使用

OC:

intage1 =10;

intage2 =20;

intmax;

max = age2;

if(age1 > age2) {

max = age1;

}

NSLog(@"%d", max);

輸出結(jié)果:20

if(age1 > age2) {

max = age1;

}else

{

max = age2;

}

NSLog(@"%d", max);

輸出結(jié)果:20

如果只有一條指令if后面的大括號可以省略

Swift:

if條件表達式{指令} ? if條件表達式{指令} else{指令}

0.if后的圓括號可以省略

1.只能以bool作為條件語句

2.如果只有條指令if后面的大括號不可以省略

varage1:Int=10

varage2:Int=20

varmax:Int

max=age2;

ifage1>age2

{

max=age1

}

print(max)

輸出結(jié)果:20

ifage1>age2

{

max=age1;

}else

{

max=age2;

}

print(max)

輸出結(jié)果:20

多分支

floatscore =99.9;

if(score >=90) {

NSLog(@"優(yōu)秀");

}else

{

if(score >=60) {

NSLog(@"良好");

}else

{

NSLog(@"不給力");

}

}

輸出結(jié)果:2016-01-06 16:08:05.833 OCTest[4239:1177565]優(yōu)秀

if(score >=90) {

NSLog(@"優(yōu)秀");

}elseif(score >=60)

{

NSLog(@"良好");

}else

{

NSLog(@"不給力");

}

輸出結(jié)果:2016-01-06 16:08:05.834 OCTest[4239:1177565]優(yōu)秀

swift:

varscore =99.9;

ifscore>=90

{

print("優(yōu)秀")

}elseifscore>=60

{

print("良好")

}else

{

print("不給力")

}

輸出結(jié)果:優(yōu)秀



12- while循環(huán)


while循環(huán)

OC:

格式:while(循環(huán)保持條件){需要執(zhí)行的語句}

inti =0;

intsum =0;

while(i <=10) {

sum = i++;

}

NSLog(@"%d",sum);

輸出結(jié)果:10

inti =0;

intsum =0;

while(i <=10)

sum = i++;

NSLog(@"%d", sum);

輸出結(jié)果:10

如果只有一條指令while后面的大括號可以省略

Swift:

0.while后的圓括號可以省略

1.只能以bool作為條件語句

2.如果只有條指令while后面的大括號不可以省略

vari:Int=0

varsum:Int=0

while(i<=10)

{

sum=i++

}

print("\(sum)")

輸出結(jié)果:10

vari1:Int=0

varsum1:Int=0

whilei1<=10

{

sum1=i1++

}

print("\(sum1)")

輸出結(jié)果:10

do while循環(huán)

inti =0;

intsum =0;

do{

sum = i++;

}while(i <=10);

NSLog(@"%d", sum);

輸出結(jié)果:10

inti =0;

intsum =0;

do

sum = i++;

while(i <=10);

NSLog(@"%d", sum);

輸出結(jié)果:10

如果只有一條指令while后面的大括號可以省略

swift:

Swift2.0之后變?yōu)閞epeat while, do用于捕捉異常

0.while后的圓括號可以省略

1.只能以bool作為條件語句

2.如果只有條指令do后面的大括號不可以省略

vari2:Int=0

varsum2:Int=0

repeat{

sum2=i2++;

}while(i2<=10)

print(sum2)

輸出結(jié)果:10

vari3:Int=0

varsum3:Int=0

repeat{

sum3=i3++;

}whilei3<=10

print(sum3)

輸出結(jié)果:10



13-for循環(huán)


OC:

intsum =0;

for(inti =0; i <=10; i++) {

sum = i++;

}

NSLog(@"%d", sum);

輸出結(jié)果:10

intsum =0;

inti =0;

for(; i <=10; i++) {

sum = i++;

}

NSLog(@"%d", sum);

輸出結(jié)果:10

intsum =0;

inti =0;

for(; i <=10; ) {

sum = i++;

i++;

}

NSLog(@"%d", sum);

輸出結(jié)果:10

intsum =0;

inti =0;

for( ; ; ) {

sum = i++;

i++;

if(i >10) {

break;

}

}

NSLog(@"%d", sum);

輸出結(jié)果:10

intsum =0;

inti =0;

for( ; ; ) {

sum = i++;

i++;

NSLog(@"%d", sum);

}

輸出結(jié)果:死循環(huán)

如果只有一條指令for后面的大括號可以省略

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

Swift:

0.for后的圓括號可以省略

1.只能以bool作為條件語句

2.如果只有條指令for后面的大括號不可以省略

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

varsum:Int=0

forvari =0; i <=10; i++

{

sum= i++

}

print(sum)

輸出結(jié)果:10

varsum1:Int=0

vari1 =0

for;i1<=10;i1++

{

sum1=i1++

}

print(sum1)

輸出結(jié)果:10

varsum2:Int=0

vari2 =0

for;i2<=10;

{

sum2=i2++

i2++

}

print(sum2)

輸出結(jié)果:10

varsum3:Int=0

vari3 =0

for; ;

{

sum3=i3++

i3++

ifi3>10

{

break

}

}

print(sum3)

輸出結(jié)果:10

for in循環(huán)

OC:

格式: for (接收參數(shù)in取出的參數(shù)) {需要執(zhí)行的語句}

for in含義:從(in)取出什么給什么,直到取完為止

for(NSNumber*iin@[@1,@2,@3,@4,@5]) {

NSLog(@"%@", i);

}

輸出結(jié)果:

2016-01-06 17:17:38.669 OCTest[4599:1510680] 1

2016-01-06 17:17:38.670 OCTest[4599:1510680] 2

2016-01-06 17:17:38.670 OCTest[4599:1510680] 3

2016-01-06 17:17:38.670 OCTest[4599:1510680] 4

2016-01-06 17:17:38.670 OCTest[4599:1510680] 5

NSDictionary*dict =@{@"name":@"LZH",@"age":@100};

for(NSArray*keysindict.allKeys) {

NSLog(@"%@", keys);

}

輸出結(jié)果:

2016-01-06 17:18:17.419 OCTest[4609:1515258] name

2016-01-06 17:18:17.420 OCTest[4609:1515258] age

NSDictionary*dict =@{@"name":@"lzh",@"age":@30};

for(NSArray*keysindict.allValues) {

NSLog(@"%@", keys);

}

輸出結(jié)果:

2016-01-06 17:18:47.592 OCTest[4619:1519194] lzh

2016-01-06 17:18:47.593 OCTest[4619:1519194] 30

Swift:

for in一般用于遍歷區(qū)間或者集合

varsum4:Int=0

fori4in1...10會將區(qū)間的值依次賦值給i

{

sum4+= i4;

}

print(sum4)

輸出結(jié)果:55

fordictin["name":"LZH","age":30]

{

print(dict);

}

輸出結(jié)果:

("age", 30)

("name", lzh)

for(key, value)in["name":"LZH","age":30]

{

print("\(key) =\(value)")

}

輸出結(jié)果:

age = 30

name = LZH



14-break-continue


break:跳出循環(huán),無論循環(huán)保持條件是否還為真都不會再執(zhí)行循環(huán)

continue:跳出本次循環(huán),如果循環(huán)保持條件還為真還會繼續(xù)執(zhí)行循環(huán)

OC:

NSArray*arr =@[@1,@3,@5,@7,@8];

for(NSNumber*numinarr) {

if([numisEqualTo:@(7)]) {

NSLog(@"找到幸運數(shù)字");

break;

}

NSLog(@"沒有找到幸運數(shù)字");

}

輸出結(jié)果:

2016-01-06 17:23:07.807 OCTest[4684:1554896]沒有找到幸運數(shù)字

2016-01-06 17:23:07.808 OCTest[4684:1554896]沒有找到幸運數(shù)字

2016-01-06 17:23:07.808 OCTest[4684:1554896]沒有找到幸運數(shù)字

2016-01-06 17:23:07.808 OCTest[4684:1554896]找到幸運數(shù)字

NSArray *arr =@[@1,@3,@5,@7,@8];

intcount =0;

for(NSNumber *numinarr) {

if(num.intValue %2!=0) {

NSLog(@"不能被2整除");

continue;

}

NSLog(@"能被2整除");

count++;

}

NSLog(@"count = %d", count);

輸出結(jié)果:

2016-01-06 17:23:48.005 OCTest[4694:1560348]不能被2整除

2016-01-06 17:23:48.006 OCTest[4694:1560348]不能被2整除

2016-01-06 17:23:48.006 OCTest[4694:1560348]不能被2整除

2016-01-06 17:23:48.006 OCTest[4694:1560348]不能被2整除

2016-01-06 17:23:48.006 OCTest[4694:1560348]能被2整除

2016-01-06 17:23:48.006 OCTest[4694:1560348] count = 1

Swift:

vararr:Array = [1,3,5,7,8]

fornuminarr{

ifnum ==7

{

print("找到幸運數(shù)字")

break

}

print("沒有找到幸運數(shù)字")

}

輸出結(jié)果:

沒有找到幸運數(shù)字

沒有找到幸運數(shù)字

沒有找到幸運數(shù)字

找到幸運數(shù)字

vararr1:Array = [1,3,5,7,8]

varcount:Int=0

fornuminarr1{

ifnum %2!=0

{

print("不能被2整除")

continue

}

print("能被2整除")

count++

}

print("count =\(count)")

輸出結(jié)果:

不能被2整除

不能被2整除

不能被2整除

不能被2整除

能被2整除

count = 1



15- Switch


格式: switch(需要匹配的值) case匹配的值:需要執(zhí)行的語句break;

可以穿透

可以不寫default

default位置可以隨便放

在case中定義變量需要加大括號,否則作用域混亂

不能判斷對象類型

OC:

charrank ='A';

switch(rank) {

case'A':

NSLog(@"優(yōu)");

break;

case'B':

NSLog(@"良");

break;

case'C':

NSLog(@"差");

break;

default:

NSLog(@"沒有評級");

break;

}

輸出結(jié)果:優(yōu)

可以穿透

charrank ='A';

switch(rank) {

case'A':

NSLog(@"優(yōu)");

case'B':

NSLog(@"良");

break;

case'C':

NSLog(@"差");

break;

default:

NSLog(@"沒有評級");

break;

}

輸出結(jié)果:

2016-01-06 20:15:41.643 OCTest[6617:1852944]優(yōu)

2016-01-06 20:15:41.644 OCTest[6617:1852944]良

可以不寫default

charrank ='A';

switch(rank) {

case'A':

NSLog(@"優(yōu)");

break;

case'B':

NSLog(@"良");

break;

case'C':

NSLog(@"差");

break;

}

輸出結(jié)果:

2016-01-06 20:16:30.171 OCTest[6629:1860297]優(yōu)

default位置可以隨便放

charrank ='E';

switch(rank) {

default:

NSLog(@"沒有評級");

break;

case'A':

{

intscore =100;

NSLog(@"優(yōu)");

break;

}

case'B':

NSLog(@"良");

break;

case'C':

NSLog(@"差");

break;

}

輸出結(jié)果:

2016-01-06 20:17:14.444 OCTest[6639:1866501]沒有評級

case中定義變量需要加大括號,否則作用域混亂

charrank ='A';

switch(rank) {

case'A':

{

intscore =100;

NSLog(@"優(yōu)");

break;

}

case'B':

NSLog(@"良");

break;

case'C':

NSLog(@"差");

break;

}

輸出結(jié)果:

2016-01-06 20:17:56.849 OCTest[6649:1872272]優(yōu)

不能判斷對象類型

以下寫法是錯誤的

NSNumber*num =@100;

switch(num) {

case@100:

NSLog(@"優(yōu)");

break;

default:

NSLog(@"沒有評級");

break;

}

Swift:

Swift:可以判斷對象類型, OC必須是整數(shù)

不可以穿透

可以不寫break

不能不寫default

default位置只能在最后

在case中定義變量不用加大括號

varrank ="A"

switchrank{

case"A":相當于if

print("優(yōu)")

case"B":相當于else if

print("優(yōu)")

case"C":相當于else if

print("優(yōu)")

default:相當于else

print("沒有評級")

}

因為不能穿透所以不能這么寫

以下寫法是錯誤的:

varrank1 ="A"

switchrank1{

case"A":

case"B":

print("優(yōu)")

case"C":

print("優(yōu)")

default:

print("沒有評級")

}

只能這么寫

varrank1 ="A"

switchrank1{

case"A","B":注意OC不能這樣寫

print("優(yōu)")

case"C":

print("差")

default:

print("沒有評級")

}

不能不寫default

以下寫法是錯誤的:

varrank2 ="A"

switchrank2{

case"A":

print("優(yōu)")

case"B":

print("良")

case"C":

print("差")

}

default位置只能在最后

以下寫法是錯誤的:

varrank3 ="A"

switchrank3{

default:

print("沒有評級")

case"A":

print("優(yōu)")

case"B":

print("良")

case"C":

print("差")

}

case中定義變量不用加大括號

varrank4 ="A"

switchrank4{

case"A":

varnum =10

print("優(yōu)")

case"B":

print("良")

case"C":

print("差")

default:

print("沒有評級")

}

輸出結(jié)果:優(yōu)

區(qū)間和元祖匹配

varnum =10;

switchnum{

case1...9:

print("個位數(shù)")

case10...99:

print("十位數(shù)")

default:

print("其它數(shù)")

}

輸出結(jié)果:十位數(shù)

varpoint = (10,15)

switchpoint{

case(0,0):

print("坐標在原點")

case(1...10,10...20):可以在元祖中再加上區(qū)間

print("坐標的X和Y在1~10之間")

case(_,0):X可以是任意數(shù)

print("坐標的X在X軸上")

default:

print("Other")

}

輸出結(jié)果:坐標的XY1~10之間

值綁定

varpoint = (1,10)

switchpoint{

case(varx,10):會將point中X的值賦值給X

print("x=\(x)")

case(varx,vary):會將point中XY的值賦值給XY

print("x=\(x) y=\(y)")

casevar( x, y):

print("x=\(x) y=\(y)")

default:

print("Other")

}

輸出結(jié)果:

x= 1

根據(jù)條件綁定

varpoint = (100,10)

switchpoint{

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

casevar(x, y)wherex > y:

print("x=\(x) y=\(y)")

default:

print("Other")

}

輸出結(jié)果:x= 100 y= 10



16-函數(shù)定義


函數(shù):

完成某個特定任務(wù)的代碼塊,給代碼起一個合適的名稱稱之為函數(shù)名稱.

以后需要執(zhí)行代碼塊只需要利用函數(shù)名稱調(diào)用即可.

好比每個人都有一個名字,叫名字就能找到對應(yīng)的人

OC:

不帶參數(shù)

- (void)say

{

NSLog(@"hello");

}

帶有一個參數(shù)

- (void)sayWithName:(NSString *)name

{

NSLog(@"hello %@", name);

}

帶有多個參數(shù)

- (void)sayWithName:(NSString *)name age:(NSInteger)age

{

NSLog(@"hello %@ , I'm %tu years old", name, age);

}

有返回值

- (NSString *)info

{

return@"name = gxq, age = 30";

}

有返回值,并且?guī)в蟹祷刂?/p>

- (NSString *)infoWithName:(NSString *)name age:(NSInteger)age

{

return[NSString stringWithFormat:

@"name = %@,

age = %tu", name, age];

}

swift:

格式:

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

無參無返回值

funcsay() ->Void

{

print("hello")

}

say()

輸出結(jié)果:hello

funcsay1()如果沒有返回值可以不寫

{

print("hello")

}

say1()

輸出結(jié)果:hello

有參無返回值

funcsayWithName(name:String)

{

print("hello\(name)")

}

sayWithName("gxq")

輸出結(jié)果:hello gxq

帶有多個參數(shù)

funcsayWithName(name:String, age:Int)

{

print("hello\(name) , I'm\(age) years old ")

}

sayWithName("gxq", age:30)

輸出結(jié)果:hello gxq , I'm 30 years old

無參有返回值

funcinfo() ->String

{

return"name = gaowei, age = 30"

}

print(info())

輸出結(jié)果:name = gaowei, age = 30

有參有返回值

funcinfo(name:String, age:Int) ->String

{

return"name =\(name), age =\(age)"

}

print(info("lzh", age:30))

輸出結(jié)果:name = lzh, age = 30

嵌套函數(shù)

vararr:Array = ["lzh","gaowei","520"]

funcshowArray(array:[String])

{

fornumberinarray

{

print("\(number), ")

}

}

showArray(arr)

輸出結(jié)果:

lzh,

gaowei,

520,

funcbubbleSort(inoutarray:[Int])

{

funcswap(inouta:Int,inoutb:Int)

{

lettemp = a

a = b

b = temp

}

letcount = array.count;

forvari =1; i < count; i++

{

forvarj =0; j < (count - i); j++

{

ifarray[j] > array[j +1]

{

swap(&array[j], b: &array[j +1])

}

}

}

}

vararr:Array = [50,20,30,80]

bubbleSort(&arr)

print(arr)

輸出結(jié)果:[20, 30, 50, 80]



17- 內(nèi)部函數(shù),外部函數(shù)


內(nèi)部函數(shù):默認情況下的參數(shù)都是內(nèi)部參數(shù)

外部函數(shù):如果有多個參數(shù)的情況,調(diào)用者并不知道每個參數(shù)的含義,

只能通過查看頭文件的形式理解參數(shù)的含義

那么能不能和OC一樣讓調(diào)用者直觀的知道參數(shù)的含義呢?使用外部參數(shù)

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

funcdivisionOpertaion1(a:Double, b:Double) ->Double{

returna / b

}

funcdivisionOpertaion2(dividend:Double, divisor:Double) ->Double{

returndividend / divisor

}

funcdivisionOpertaion3(dividend a:Double, divisor b:Double) ->Double{

returna / b

}

print(divisionOpertaion3(dividend:10, divisor:3.5))

funcdivisionOpertaion4(a:Double, divisor b:Double) ->Double{

returna / b

}

print(divisionOpertaion4(10, divisor:3.5))

輸出結(jié)果:

2.85714285714286

2.85714285714286

funcdivisionOpertaion(dividend:Double, divisor:Double) ->Double{

returndividend / divisor

}

print(divisionOpertaion(10, divisor:3.5))

輸出結(jié)果:2.85714285714286

默認參數(shù):

可以在定義函數(shù)的時候給某個參數(shù)賦值,當外部調(diào)用沒有傳遞該參數(shù)時會自動使用默認值

funcjoinString(s1:String,toString s2:String, jioner s3:String) ->String

{

returns1 + s3 + s2;

}

funcjoinString2(s1:String,toString

s2:String, jioner

s3:String="??") ->String

{

returns1 + s3 + s2;

}

print(joinString2("hi", toString:"beauty"))

輸出結(jié)果:hi??beauty

如果指定了默認參數(shù),但是確沒有聲明外部參數(shù)時

系統(tǒng)會自動把內(nèi)部參數(shù)名稱既作為內(nèi)部參數(shù)也作為外部參數(shù)名稱

并且在調(diào)用時如果需要修改默認參數(shù)的值必須寫上外部參數(shù)名稱

funcjoinString3(s1:String,toString

s2:String,

jioner:String="??") ->String

{

returns1 + jioner + s2;

}

print(joinString3("hi", toString:"beauty", jioner:"??"))

輸出結(jié)果:hi??beauty

在其它語言中默認參數(shù)智能出現(xiàn)在參數(shù)列表的最后面,但是在Swift中可以出現(xiàn)在任何位置

funcjoinString4(s1:String,

jioner:String="??",

toString s2:String) ->String

{

returns1 + jioner + s2;

}

print(joinString4("hi", jioner:"??", toString:"beauty"))

輸出結(jié)果:hi??beauty

常量參數(shù)和遍歷參數(shù):

默認情況下Swift中所有函數(shù)的參數(shù)都是常量參數(shù)

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

funcswap(vara:Int,varb:Int)

{

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

lettemp = a;

a = b;

b = temp;

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

}

swap(10, b:20)

輸出結(jié)果:

交換前a = 10 b = 20

交換后a = 20 b = 10

inout參數(shù)

如果想在函數(shù)中修改外界傳入的參數(shù)

可以將參數(shù)的var換成inout,這回會傳遞參數(shù)本身而不是參數(shù)的值

funcswap(inouta:Int,inoutb:Int)

{

lettemp = a;

a = b;

b = temp;

}

varx1 =10;

vary1 =20;

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

swap(&x1, b: &y1)

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

輸出結(jié)果:

交換前a = 10 b = 20

交換后a = 20 b = 10

變參函數(shù)

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

變參只能放到參數(shù)列表的最后一位,變參必須指定數(shù)據(jù)類型,變參只能是同種類型的數(shù)據(jù)

funcadd(num1:Int, num2:Int, num3:Int) ->Int

{

letsum = num1 + num2 + num3

returnsum

}

print(add(1, num2:2, num3:3))

輸出結(jié)果:6

funcadd(nums:[Int]) ->Int

{

varsum =0;

fornuminnums

{

sum += num

}

returnsum

}

print(add([1,2,3]))

輸出結(jié)果:6

funcadd(nums:Int...) ->Int

{

varsum =0;

fornuminnums

{

sum += num

}

returnsum

}

print(add(1,2,3))

輸出結(jié)果:6

funcadd(other:Int, nums:Int...) ->Int

{

varsum =0;

fornuminnums

{

sum += num

}

returnsum

}

print(add(99, nums:1,2,3))

輸出結(jié)果:6



18- 函數(shù)類型


函數(shù)類型:

類似于C語言的指向函數(shù)的指針

類似于OC語言的block

函數(shù)類型是由函數(shù)的參數(shù)類型和返回值類型組成的

這兩個函數(shù)的類型是(Int, Int) -> Int

funcsum(a:Int, b:Int) ->Int

{

returna + b;

}

funcsub(a:Int, b:Int) ->Int

{

returna - b;

}

可以利用函數(shù)類型定義函數(shù)變量和常量

varfuncP:(Int,Int) ->Int=sum

funcP=sub

print(funcP(10,20))

輸出結(jié)果:-10

funcsum(a:Int, b:Int) ->Int

{

returna + b;

}

funcsub(a:Int, b:Int) ->Int

{

returna - b;

}

函數(shù)類型可以作為函數(shù)的參數(shù)

funccalFunc(a:Int, b:Int,Option:(Int,Int) ->Int) ->Int

{

returnOption(a, b)

}

print(calFunc(10, b:20, Option:sum))

print(calFunc(10, b:20, Option:sub))

輸出結(jié)果:

30

-10

函數(shù)類型可以作為函數(shù)返回值

funcmax(a:Int, b:Int) ->Int

{

returna > b ? a : b

}

funcmin(a:Int, b:Int) ->Int

{

returna < b ? a : b

}

funcchooseFunc(getMax:Bool) -> (Int,Int) ->Int

{

returngetMax ?max:min

}

varfuncP2:(Int,Int) ->Int=chooseFunc(false)

print(funcP2(10,20))

輸出結(jié)果:10



19-閉包,閉包函數(shù)回調(diào),尾隨閉包,閉包捕獲值

閉包:

函數(shù)是閉包的一種

類似于OC語言的block

閉包表達式(匿名函數(shù)) --能夠捕獲上下文中的值

語法: in關(guān)鍵字的目的是便于區(qū)分返回值和執(zhí)行語句

閉包表達式的類型和函數(shù)的類型一樣,是參數(shù)加上返回值,也就是in之前的部分

{

(參數(shù)) ->返回值類型in

執(zhí)行語句

}

完整寫法

letsay:(String) ->Void= {

(name:String) ->Voidin

print("hi\(name)")

}

say("lzh")

輸出結(jié)果:hi lzh

沒有返回值寫法

letsay:(String) ->Void= {

(name:String)in

print("hi\(name)")

}

say("lzh")

輸出結(jié)果:hi lzh

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

letsay:() ->Void= {

print("hi lzh")

}

say()

輸出結(jié)果:hi lzh

閉包表達式作為回調(diào)函數(shù)

傳統(tǒng)數(shù)組排序?qū)懛?

缺點:不一定是小到大,不一定是全部比較,有可能只比較個位數(shù)

所以,如何比較可以交給調(diào)用者決定

funcbubbleSort(inoutarray:[Int])

{

letcount = array.count;

forvari =1; i < count; i++

{

forvarj =0; j < (count - i); j++

{

ifarray[j] > array[j +1]

{

lettemp = array[j]

array[j] = array[j +1]

array[j +1] = temp

}

}

}

}

閉包寫法:

funcbubbleSort(inoutarray:[Int], cmp: (Int,Int) ->Int)

{

letcount = array.count;

forvari =1; i < count; i++

{

forvarj =0; j < (count - i); j++

{

ifcmp(array[j], array[j +1]) == -1

{

lettemp = array[j]

array[j] = array[j +1]

array[j +1] = temp

}

}

}

}

letcmp = {

(a:Int, b:Int) ->Intin

ifa > b{

return1;

}elseifa < b

{

return-1;

}else

{

return0;

}

}

vararr:Array = [31,13,52,84,5]

bubbleSort(&arr, cmp:cmp)

print(arr)

輸出結(jié)果:

[84, 52, 31, 13, 5]

閉包作為參數(shù)傳遞

vararr:Array = [31,13,52,84,5]

bubbleSort(&arr, cmp: {

(a:Int, b:Int) ->Intin

ifa > b{

return1;

}elseifa < b

{

return-1;

}else

{

return0;

}

})

print(arr)

輸出結(jié)果:

[84, 52, 31, 13, 5]

尾隨閉包:

如果閉包是最后一個參數(shù),可以直接將閉包寫到參數(shù)列表后面

這樣可以提高閱讀性.稱之為尾隨閉包

bubbleSort(&arr) {

(a:Int, b:Int) ->Intin

ifa > b{

return1;

}elseifa < b

{

return-1;

}else

{

return0;

}

}

閉包表達式優(yōu)化

1.類型優(yōu)化,由于函數(shù)中已經(jīng)聲明了閉包參數(shù)的類型

所以傳入的實參可以不用寫類型

2.返回值優(yōu)化,同理由于函數(shù)中已經(jīng)聲明了閉包的返回值類型

所以傳入的實參可以不用寫類型

3.參數(shù)優(yōu)化, swift可以使用$索引的方式來訪問閉包的參數(shù),默認從0開始

bubbleSort(&arr){

(a , b) -> Int in

(a , b) in

if$0 > $1{

return1;

}elseif$0 < $1

{

return-1;

}else

{

return0;

}

}

如果只有一條語句可以省略return

lethehe = {

"我是lzh"

}

閉包捕獲值

funcgetIncFunc() -> (Int) ->Int

{

varmax =10

funcincFunc(x :Int) ->Int{

print("incFunc函數(shù)結(jié)束")

max++

returnmax + x

}

當執(zhí)行到這一句時inc參數(shù)就應(yīng)該被釋放了

但是由于在內(nèi)部函數(shù)中使用到了它,所以它被捕獲了

同理,當執(zhí)行完這一句時max變量就被釋放了

但是由于在內(nèi)部函數(shù)中使用到了它,所以它被捕獲了

print("getIncFunc函數(shù)結(jié)束")

returnincFunc

}

被捕獲的值會和與之對應(yīng)的方法綁定在一起

同一個方法中的變量會被綁定到不同的方法中

letincFunc =getIncFunc()

print("---------")

print(incFunc(5))

print("---------")

print(incFunc(5))

輸出結(jié)果:

getIncFunc函數(shù)結(jié)束

---------

incFunc函數(shù)結(jié)束

16

---------

incFunc函數(shù)結(jié)束

17

letincFunc2 =getIncFunc(5)

print(incFunc2(5))

輸出結(jié)果:

getIncFunc函數(shù)結(jié)束

incFunc函數(shù)結(jié)束

16

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣屏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辩棒,更是在濱河造成了極大的恐慌狼忱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一睁,死亡現(xiàn)場離奇詭異钻弄,居然都是意外死亡,警方通過查閱死者的電腦和手機者吁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來复凳,“玉大人瘤泪,你說我怎么就攤上這事∮耍” “怎么了对途?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長髓棋。 經(jīng)常有香客問我实檀,道長,這世上最難降的妖魔是什么按声? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任膳犹,我火速辦了婚禮,結(jié)果婚禮上签则,老公的妹妹穿的比我還像新娘须床。我一直安慰自己,他們只是感情好渐裂,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布侨颈。 她就那樣靜靜地躺著,像睡著了一般芯义。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妻柒,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天扛拨,我揣著相機與錄音,去河邊找鬼举塔。 笑死绑警,一個胖子當著我的面吹牛求泰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播计盒,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼渴频,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了北启?” 一聲冷哼從身側(cè)響起卜朗,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咕村,沒想到半個月后场钉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡懈涛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年逛万,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片批钠。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宇植,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埋心,到底是詐尸還是另有隱情指郁,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布踩窖,位于F島的核電站坡氯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洋腮。R本人自食惡果不足惜箫柳,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啥供。 院中可真熱鬧悯恍,春花似錦、人聲如沸伙狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贷屎。三九已至罢防,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唉侄,已是汗流浹背咒吐。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恬叹。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓候生,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绽昼。 傳聞我的和親對象是個殘疾皇子唯鸭,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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