基礎(chǔ)類型
- Swift通過var進(jìn)行變量定義瓦哎,通過let進(jìn)行常量定義
Swift添加了類型推斷吹由,對于賦值的常量或者變量會自動推斷其具體類型川抡;
Swift是強(qiáng)類型語言(應(yīng)該說它比C#沸伏、Java等強(qiáng)類型語言控制還要嚴(yán)格),不同的數(shù)據(jù)類型之間不能隱式轉(zhuǎn)化,如果需要轉(zhuǎn)化只能強(qiáng)制轉(zhuǎn)化乎芳;
-
在Swift中類型轉(zhuǎn)換直接通過其類型構(gòu)造函數(shù)即可资盅,降低了API的學(xué)習(xí)成本
let a :Int = 1 let b = 2 var c :Float = 1.0 var d = "hello" var e = "guagua" var g = d + e //hello guagua
集合類型
數(shù)組Array癣漆、集合Set隙疚、字典Dictionary楔脯。和ObjC不同的是纠脾,由于Swift的強(qiáng)類型孩哑,集合中的元素必須是同一類型栓霜,而不能像ObjC一樣可以存儲任何對象類型,并且注意Swift中的集合是值類型而非引用類型(事實(shí)上包括String、結(jié)構(gòu)體struct横蜒、枚舉enum都是值類型)胳蛮。
var a:[String]=["hello","world"]
a[0] //訪問數(shù)組元素
var b:[Double]=[] 等價于var b=[Double]()
a.append("!")
a+=["I" ,"am" ,"Kenshin"] //追加元素
a[3...5]=["I","Love","Swift"] //修改元素,但是注意無法用這種方式添加元素
a.insert("New", atIndex: 5) //插入元素:hello world! I Love New Swift
a.removeAtIndex(5) //刪除指定元素
//使用構(gòu)造函數(shù)限制數(shù)組元素個數(shù)并且指定默認(rèn)值,等價于var c=Array(count: 3, repeatedValue: 1),自動推斷類型
var c=[Int](count: 3, repeatedValue: 1)
Dictionary字典同樣是沒有順序的丛晌,并且在Swift中字典同樣要在使用時明確具體的類型仅炊。和ObjC中一樣,字典必須保證key是唯一的澎蛛,而這一點(diǎn)就要求在Swift中key必須是可哈希的抚垄,不過幸運(yùn)的是Swift中的基本類型(如Int、Float谋逻、Double呆馁、Bool、String)都是可哈希的毁兆,都可以作為key浙滤。
var a:[Int:String]=[200:"success",404:"not found"]
var b=[200:"success",404:"not found"] //不聲明類型,根據(jù)值自動推斷類型
a[200] //讀取字典
a[404]="can not found" //修改
a[500]="internal server error" //添加
//a=[:] //設(shè)置為空字典,等價于:a=[Int:String]()
元組(Tuple)
在開發(fā)過程中有時候會希望臨時組織一個數(shù)據(jù)類型气堕,此時可以使用一個結(jié)構(gòu)體或者類纺腊,但是由于這個類型并沒有那么復(fù)雜,如果定義起來又比較麻煩茎芭,此時可以考慮使用元組揖膜。
- 類似數(shù)組可以通過下標(biāo)取值,指定元素名稱還可通過名稱取值
var point=(x:50,y:100) //自動推斷其類型:(Int,Int)
point.x //可以用類似于結(jié)構(gòu)體的方式直接訪問元素,結(jié)果:50
point.y //結(jié)果:100
point.0 //也可以采用類似數(shù)組的方式使用下標(biāo)訪問,結(jié)果:50
point.1 //結(jié)果:100
- 元組作為函數(shù)的參數(shù)或返回值梅桩,借助元組實(shí)現(xiàn)了函數(shù)的多個返回值
func request()->(code:Int,description:String){
return (404,"not found")
}
var result=request()
result.0 //結(jié)果:404
result.1 //結(jié)果:not found
result.code //結(jié)果:404
result.description //結(jié)果:not found
//接收元組的其中一個值忽略另一個值使用"_"(注意在Swift中很多情況下使用_忽略某個值或變量)
var (sta,_)=result //sta = 404
可選類型
所謂可選類型就是一個變量或常量可能有值也可能沒有值則設(shè)置為可選類型壹粟。在ObjC中如果一個對象類型沒有賦值,則默認(rèn)為nil宿百,同時nil類型也只能作為對象類型的默認(rèn)值煮寡,對于類似于Int等基本類型則對應(yīng)0這樣的默認(rèn)值。由于Swift是強(qiáng)類型語言犀呼,如果在聲明變量或常量時沒有進(jìn)行賦值,Swift并不會默認(rèn)設(shè)置初值(這一點(diǎn)和其他高級語言不太一樣薇组,例如C#雖然也有可選類型外臂,但是要求并沒有那么嚴(yán)格)。
var x:Float? //使用律胀?聲明成一個可選類型宋光,如果不賦值默認(rèn)為nil
var z=x!+y //使用貌矿!進(jìn)行強(qiáng)制解包
Swift中類似于Int和Int?并不是同一種類型,不能進(jìn)行相關(guān)運(yùn)算罪佳,如果要運(yùn)算只能解包逛漫;
可選項判斷的兩種方式
if ageInt==nil {
println("ageInt=nil")
}else{
println("ageInt=\(ageInt!)") //注意這里使用感嘆號!強(qiáng)制解析
}
/**
* 可選類型綁定
* 如果可選類型有值則將值賦值給一個臨時變量或者常量(此時此變量或者常量接受的值已經(jīng)不是可選類型),如果沒有值則不執(zhí)行此條件
*/
if let newAge=ageInt{ //此時newAge可以定義成常量也可以定義成變量
println("newAge=\(newAge)") //注意這里并不需要對newAge強(qiáng)制解包
}else{
println("ageInt=nil")
}
運(yùn)算符
Swift中支持絕大多數(shù)C語言的運(yùn)算符并改進(jìn)以減少不必要的錯誤(例如等號賦值后不返回值)赘艳,算術(shù)運(yùn)算會檢查溢出情況酌毡,必要時還能使用新增的溢出運(yùn)算符。另外Swift中還可以對浮點(diǎn)數(shù)使用取余運(yùn)算符蕾管,新增了區(qū)間運(yùn)算符枷踏。對于基本的運(yùn)算符這里不再一一介紹,簡單看一下Swift中的區(qū)間運(yùn)算符和溢出運(yùn)算符掰曾。
/**
* 區(qū)間運(yùn)算符,通常用于整形或者字符范圍(例如"a"..."z")
*/
for i in 1...5 { //閉區(qū)間運(yùn)算符...(從1到5旭蠕,包含5)
println("i=\(i)")
}
for i in 1..<5{ //半開區(qū)間運(yùn)算符..<(從1到4)
println("i=\(i)")
}
var str = "hello world."
var range="a"..."z"
for t in str {
if range.contains(String(t)) {
print(t) //結(jié)果:helloworld
}
}
/**
* 溢出運(yùn)算符
*/
var a=UInt8.max //a=255
//var b:UInt8=a+1 //注意b會出現(xiàn)溢出,此句報錯
//下面使用溢出運(yùn)算符,結(jié)果為:0旷坦,類似的還有&-掏熬、&*、&/
//使用溢出運(yùn)算符可以在最大值和最小值之前循環(huán)而不會報錯
var b:UInt8=a &+ 1
控制流
Swift中的多數(shù)控制流和其他語言差別并不大秒梅,例如for旗芬、while、do while番电、if岗屏、switch等,而且有些前面已經(jīng)使用過(例如for in循環(huán))漱办,這里將著重介紹一些不同點(diǎn)这刷。
switch支持一個case多個模式匹配,同時case后不用寫break也會在匹配到種情況后自動跳出匹配娩井,不存在隱式貫穿暇屋,如果想要貫穿在case之后添加"fallthrough"關(guān)鍵字
switch b{
case "a","b":
println("b=a or b=b")
case "c","d","e","f":
println("b in (c,d,e,f)")
default:
println("b=g")
}
匹配區(qū)間,同時注意switch必須匹配所有情況,否則必須加上default
let c:Int=88
switch c{
case 1...60:
println("1-60")
case 61...90:
println("61-90")
case 91...100:
println("91-100")
default:
println("1>c>100")
}
- 元組匹配洞辣、值綁定咐刨、where條件匹配
- 注意下面的匹配沒有default,因?yàn)樗怂星闆r
var d=(x:900,y:0)
switch d{
case (0,0):
println("d in (0,0)")
case (_,0): //忽略x值匹配
println("d in y")
case (0,let y)://值綁定
println("d in x,y=\(y)")
case (-100...100,-100...100): //注意這里有可能和第一扬霜、二定鸟、三個條件重合,但是Swift允許多個case匹配同一個條件著瓶,但是只會執(zhí)行第一個匹配
println("x in(0-100)联予,y in (0-100)")
case let (x,y) where x==y: //where條件匹配,注意這里的寫法等同于:(let x,let y) where x==y
println("x=y=\(x)")
case let (x, y):
println("x=\(x),y=\(y)")
在其他語言中通常可以使用break、continue沸久、return(Swift中添加了fallthrough)等來終止或者跳出某個執(zhí)行語句季眷,但是對于其行為往往是具有固定性的,例如break只能終止其所在的內(nèi)層循環(huán)卷胯,而return只能跳出它所在的函數(shù)子刮。在Swift中這種控制轉(zhuǎn)移功能得到了加強(qiáng),那就是使用標(biāo)簽窑睁。利用標(biāo)簽?zāi)憧梢噪S意指定轉(zhuǎn)移的位置挺峡,例如下面的代碼演示了如何直接通過標(biāo)簽跳出最外層循環(huán):
var a=5
whileLoop:
while --a>0 {
for var i=0;i<a;++i{
println("a=\(a),i=\(i)")
break whileLoop
//如果此處直接使用break將跳出for循環(huán),而由于這里使用標(biāo)簽直接跳出了while卵慰,結(jié)果只會打印一次沙郭,其結(jié)果為:a=4,i=0
}
}