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

基礎(chǔ)類型

  1. Swift通過var進(jìn)行變量定義瓦哎,通過let進(jìn)行常量定義
  1. Swift添加了類型推斷吹由,對于賦值的常量或者變量會自動推斷其具體類型川抡;

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

  3. 在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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裳朋,隨后出現(xiàn)的幾起案子病线,更是在濱河造成了極大的恐慌,老刑警劉巖鲤嫡,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送挑,死亡現(xiàn)場離奇詭異,居然都是意外死亡暖眼,警方通過查閱死者的電腦和手機(jī)惕耕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诫肠,“玉大人司澎,你說我怎么就攤上這事《霸ィ” “怎么了挤安?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵丧鸯,是天一觀的道長围肥。 經(jīng)常有香客問我杠步,道長,這世上最難降的妖魔是什么试躏? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任泣刹,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘员舵。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布可很。 她就那樣靜靜地躺著,像睡著了一般瓣窄。 火紅的嫁衣襯著肌膚如雪裳凸。 梳的紋絲不亂的頭發(fā)上映九,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音引有,去河邊找鬼瓣颅。 笑死,一個胖子當(dāng)著我的面吹牛譬正,可吹牛的內(nèi)容都是我干的宫补。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼导帝,長吁一口氣:“原來是場噩夢啊……” “哼守谓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起您单,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤斋荞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虐秦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體平酿,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年悦陋,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜈彼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡俺驶,死狀恐怖幸逆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暮现,我是刑警寧澤还绘,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站栖袋,受9級特大地震影響拍顷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塘幅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一昔案、第九天 我趴在偏房一處隱蔽的房頂上張望尿贫。 院中可真熱鬧,春花似錦踏揣、人聲如沸庆亡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽身冀。三九已至,卻和暖如春括享,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珍促。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工铃辖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猪叙。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓娇斩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穴翩。 傳聞我的和親對象是個殘疾皇子犬第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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