Swift基礎(chǔ)學(xué)習(xí)1(基礎(chǔ)類型,集合類型,元組,可選類型,運(yùn)算符,控制流)

基礎(chǔ)類型

  1. Swift通過(guò)var進(jìn)行變量定義,通過(guò)let進(jìn)行常量定義
  1. Swift添加了類型推斷,對(duì)于賦值的常量或者變量會(huì)自動(dòng)推斷其具體類型;

  2. Swift是強(qiáng)類型語(yǔ)言(應(yīng)該說(shuō)它比C#、Java等強(qiáng)類型語(yǔ)言控制還要嚴(yán)格),不同的數(shù)據(jù)類型之間不能隱式轉(zhuǎn)化,如果需要轉(zhuǎn)化只能強(qiáng)制轉(zhuǎn)化;

  3. 在Swift中類型轉(zhuǎn)換直接通過(guò)其類型構(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一樣可以存儲(chǔ)任何對(duì)象類型,并且注意Swift中的集合是值類型而非引用類型(事實(shí)上包括String、結(jié)構(gòu)體struct、枚舉enum都是值類型)。

var a:[String]=["hello","world"]
a[0] //訪問(wèn)數(shù)組元素

var b:[Double]=[] 等價(jià)于var b=[Double]()
a.append("!")
a+=["I" ,"am" ,"Kenshin"] //追加元素
a[3...5]=["I","Love","Swift"] //修改元素,但是注意無(wú)法用這種方式添加元素

a.insert("New", atIndex: 5) //插入元素:hello world! I Love New Swift
 
a.removeAtIndex(5) //刪除指定元素
//使用構(gòu)造函數(shù)限制數(shù)組元素個(gè)數(shù)并且指定默認(rèn)值,等價(jià)于var     c=Array(count: 3, repeatedValue: 1),自動(dòng)推斷類型
var c=[Int](count: 3, repeatedValue: 1)

Dictionary字典同樣是沒(méi)有順序的,并且在Swift中字典同樣要在使用時(shí)明確具體的類型。和ObjC中一樣,字典必須保證key是唯一的,而這一點(diǎn)就要求在Swift中key必須是可哈希的,不過(guò)幸運(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ù)值自動(dòng)推斷類型

a[200] //讀取字典
a[404]="can not found" //修改

a[500]="internal server error" //添加
//a=[:] //設(shè)置為空字典,等價(jià)于:a=[Int:String]()

元組(Tuple)

在開發(fā)過(guò)程中有時(shí)候會(huì)希望臨時(shí)組織一個(gè)數(shù)據(jù)類型,此時(shí)可以使用一個(gè)結(jié)構(gòu)體或者類,但是由于這個(gè)類型并沒(méi)有那么復(fù)雜,如果定義起來(lái)又比較麻煩,此時(shí)可以考慮使用元組。

  • 類似數(shù)組可以通過(guò)下標(biāo)取值,指定元素名稱還可通過(guò)名稱取值
var point=(x:50,y:100) //自動(dòng)推斷其類型:(Int,Int)
point.x //可以用類似于結(jié)構(gòu)體的方式直接訪問(wèn)元素,結(jié)果:50
point.y //結(jié)果:100
point.0 //也可以采用類似數(shù)組的方式使用下標(biāo)訪問(wèn),結(jié)果:50
point.1 //結(jié)果:100
  • 元組作為函數(shù)的參數(shù)或返回值,借助元組實(shí)現(xiàn)了函數(shù)的多個(gè)返回值
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

//接收元組的其中一個(gè)值忽略另一個(gè)值使用"_"(注意在Swift中很多情況下使用_忽略某個(gè)值或變量)
var (sta,_)=result  //sta = 404

可選類型

所謂可選類型就是一個(gè)變量或常量可能有值也可能沒(méi)有值則設(shè)置為可選類型。在ObjC中如果一個(gè)對(duì)象類型沒(méi)有賦值,則默認(rèn)為nil,同時(shí)nil類型也只能作為對(duì)象類型的默認(rèn)值,對(duì)于類似于Int等基本類型則對(duì)應(yīng)0這樣的默認(rèn)值。由于Swift是強(qiáng)類型語(yǔ)言,如果在聲明變量或常量時(shí)沒(méi)有進(jìn)行賦值,Swift并不會(huì)默認(rèn)設(shè)置初值(這一點(diǎn)和其他高級(jí)語(yǔ)言不太一樣,例如C#雖然也有可選類型,但是要求并沒(méi)有那么嚴(yán)格)。

var x:Float? //使用?聲明成一個(gè)可選類型,如果不賦值默認(rèn)為nil
var z=x!+y //使用!進(jìn)行強(qiáng)制解包

Swift中類似于Int和Int?并不是同一種類型,不能進(jìn)行相關(guān)運(yùn)算,如果要運(yùn)算只能解包;

可選項(xiàng)判斷的兩種方式

if ageInt==nil {
    println("ageInt=nil")
}else{
    println("ageInt=\(ageInt!)") //注意這里使用感嘆號(hào)!強(qiáng)制解析
}
 
/**
 * 可選類型綁定
 * 如果可選類型有值則將值賦值給一個(gè)臨時(shí)變量或者常量(此時(shí)此變量或者常量接受的值已經(jīng)不是可選類型),如果沒(méi)有值則不執(zhí)行此條件
 */
if let newAge=ageInt{ //此時(shí)newAge可以定義成常量也可以定義成變量
    println("newAge=\(newAge)") //注意這里并不需要對(duì)newAge強(qiáng)制解包
}else{
    println("ageInt=nil")
}

運(yùn)算符

Swift中支持絕大多數(shù)C語(yǔ)言的運(yùn)算符并改進(jìn)以減少不必要的錯(cuò)誤(例如等號(hào)賦值后不返回值),算術(shù)運(yùn)算會(huì)檢查溢出情況,必要時(shí)還能使用新增的溢出運(yùn)算符。另外Swift中還可以對(duì)浮點(diǎn)數(shù)使用取余運(yùn)算符,新增了區(qū)間運(yùn)算符。對(duì)于基本的運(yùn)算符這里不再一一介紹,簡(jiǎ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會(huì)出現(xiàn)溢出,此句報(bào)錯(cuò)
 
//下面使用溢出運(yùn)算符,結(jié)果為:0,類似的還有&-、&*、&/
//使用溢出運(yùn)算符可以在最大值和最小值之前循環(huán)而不會(huì)報(bào)錯(cuò)
var b:UInt8=a &+ 1

控制流

Swift中的多數(shù)控制流和其他語(yǔ)言差別并不大,例如for、while、do while、if、switch等,而且有些前面已經(jīng)使用過(guò)(例如for in循環(huán)),這里將著重介紹一些不同點(diǎn)。

switch支持一個(gè)case多個(gè)模式匹配,同時(shí)case后不用寫break也會(huì)在匹配到種情況后自動(dòng)跳出匹配,不存在隱式貫穿,如果想要貫穿在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ū)間,同時(shí)注意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條件匹配
  • 注意下面的匹配沒(méi)有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): //注意這里有可能和第一、二、三個(gè)條件重合,但是Swift允許多個(gè)case匹配同一個(gè)條件,但是只會(huì)執(zhí)行第一個(gè)匹配
    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)")

在其他語(yǔ)言中通常可以使用break、continue、return(Swift中添加了fallthrough)等來(lái)終止或者跳出某個(gè)執(zhí)行語(yǔ)句,但是對(duì)于其行為往往是具有固定性的,例如break只能終止其所在的內(nèi)層循環(huán),而return只能跳出它所在的函數(shù)。在Swift中這種控制轉(zhuǎn)移功能得到了加強(qiáng),那就是使用標(biāo)簽。利用標(biāo)簽?zāi)憧梢噪S意指定轉(zhuǎn)移的位置,例如下面的代碼演示了如何直接通過(guò)標(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é)果只會(huì)打印一次,其結(jié)果為:a=4,i=0
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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