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é)果:坐標的X和Y在1~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