swift基礎(chǔ)

1滋饲、常量和變量

變量: var 常量: let

常量&變量的使用原則:盡量先用 let俐筋,只有需要變的時(shí)候匪凡,再用 var,能夠更加安全

var定義變量织中,設(shè)置之后可以修改let定義常量锥涕,設(shè)置之后不可以修改語句末尾不用使用 `;`在Swift中使用 `print()` 替代OC中的 `NSLog``print` 的性能更好// 定義變量vari =10print(i)i =15print(i)letj =20// 常量一經(jīng)定義不能自改數(shù)值//? ? ? ? j = 25print(j)

定義OC對象

// 實(shí)例化視圖letv =UIView(frame:CGRectMake(0,0,100,100))// 設(shè)置背景顏色, 當(dāng)前對象的屬性,不需要使用 `self.`v.backgroundColor =UIColor.redColor()// 添加到根視圖view.addSubview(v) 使用 `let` 修飾 `v` 并且賦值狭吼,表示 `該常量的內(nèi)存地址不允許修改层坠,但是可以修改其內(nèi)部的屬性`

類型推導(dǎo)

使用自動(dòng)類型推導(dǎo)好處: 大大降低代碼中的冗余代碼

-Swift中如果在定義變量/常量時(shí)進(jìn)行初始化, 那么數(shù)據(jù)類型可以不用寫, 系統(tǒng)會(huì)自動(dòng)根據(jù)右邊的復(fù)制推導(dǎo)出變量/常量的類型-Swift開發(fā)中能不寫數(shù)據(jù)類型就不寫數(shù)據(jù)類型, 盡量使用編譯器的自動(dòng)推導(dǎo)-只有當(dāng)我們需要明確的指定數(shù)據(jù)的長度, 獲取需要先定義再初始化時(shí)才明確的指定數(shù)據(jù)類型let number3 = 10.10var number4: Int? number4 = 99

類型轉(zhuǎn)換

Swift中只有顯示轉(zhuǎn)換沒有隱式轉(zhuǎn)換,

OC中有顯示轉(zhuǎn)換和隱式轉(zhuǎn)換 doublevalue=10.1+9Swift中只有顯示轉(zhuǎn)換沒有隱式轉(zhuǎn)換, 也就是說只有相同類型的數(shù)據(jù)才能進(jìn)行賦值和計(jì)算// 只有相同數(shù)據(jù)類型才能賦值letnumber5:Int= Int(55.5)// 只有相同數(shù)據(jù)類型才能進(jìn)行運(yùn)算letnumber6=10letnumber7=88.8letsum= Double(number6) + number7// CGFloat --> doubleletsize= CGSize(width:10, height:10)letnumber8=10.1letsum2= size.width + CGFloat(number8)

2、元祖

元祖.png

3刁笙、邏輯分支

for

importUIKit/*

普通for循環(huán), 和OC中基本一致

*/// 0~9forvari =0;i <10;i++{print(i)}// Swift特色循環(huán)// 0..<10 代表一個(gè)區(qū)間范圍 從0開始到9, 包含頭不包含尾// Swift1.0時(shí) 0..10foriin0..<10{print(i)}// _ 代表忽略, 如果不關(guān)心某個(gè)參數(shù), 就可以使用_// 在Swift開發(fā)中 _ 使用頻率非常高for_in0..<10{print("lnj")}// 0...10 代表一個(gè)區(qū)間范圍 從0開始到10, 包含頭又包含尾foriin0...10{print(i)}

while

/*

Swift中的while循環(huán)和OC中差不多, 而且在開發(fā)中很少使用while

*/vara =0whilea <10{print(a)? ? a++}/*

Swift升級到2.0之后, do while循環(huán)發(fā)生了很大的變化

do while沒有do了, 因?yàn)閐o被用作捕獲異常了

*/varb =0repeat{print(b)? ? b++}whileb<10

if

vari =10ifi >0{print("OK")}* 階段性小結(jié)? ? * `Swift` 中沒有C語言中的`非零即真`概念? ? * 在邏輯判斷時(shí)必須顯示地指明具體的判斷條件? ? * `if` 語句條件的 `()` 可以省略? ? * 但是 `{}` 不能省略

switch

Swift中的switch1. 后面的()可以省略2.OC中的switch如果沒有break會(huì)穿透, 但是OC中不會(huì),Swift不會(huì)穿透3.OC中如果要在case中間定義變量, 必須加上{}確定作用域, 而Swift中不用4.OC中default的位置可以隨便寫, 只有所有case都不滿足才會(huì)執(zhí)行default而Swift中的default只能放在最后5.OC中的default可以省略,Swift中"大部分"情況下不能省略switchnum{case1:print("1")letvalue =998case5:print("5")case10:print("10")default:print("other")}

Bool類型

C語言和OC并沒有真正的Bool類型,非0即真OC語言的Bool類型YES/NO是`typedef signed charBOOL;`Swift引入了真正的Bool類型Swift中沒有C和OC中非零即真的概念Swfit中邏輯值只有兩個(gè)true/false

三目

vara =10varb =50varresult = a > b ? a : bprint(result)* 階段性小結(jié)? ? * `Swift` 中的 `三目` 運(yùn)算保持了和OC一致的風(fēng)格

guard

guard一般用于避免使用強(qiáng)制拆包, 優(yōu)化代碼結(jié)構(gòu)

guard語句是在Swift2.0中引進(jìn)的破花,它是用途是在未滿足某個(gè)條件時(shí),提供一個(gè)退出的路徑guard語句判斷其后的表達(dá)式布爾值為false時(shí)采盒,才會(huì)執(zhí)行之后代碼塊里的代碼旧乞,如果為true,則跳過整個(gè)guard語句

4磅氨、可選類型 / 可選綁定

可選類型

可選類型* 什么是可選類型: 一個(gè)變量可以有值也可以沒有值, 我們就稱之為可選類型* 在Swift中如果使用一個(gè)可選類型的變量/常量, 必須解包操作* 解包: 只需要在變量/常量后面加上 !* !含義: 代表告訴系統(tǒng)該變量/常量中一定有值, 如果強(qiáng)制解包一個(gè)沒有值的常量/變量,那么會(huì)報(bào)錯(cuò)* 優(yōu)點(diǎn): 提高代碼閱讀性* 格式: 修飾符 變量名稱:Optional<數(shù)據(jù)類型>? ? ? ? 修飾符 變量名稱: 數(shù)據(jù)類型?* 語法糖: 因?yàn)樵赟wift中可選類型用得非常非常多, 所以為了簡化代碼,Swift提供了一個(gè)語法糖, 可以用? 代替Optional<數(shù)據(jù)類型>提示:對于初學(xué)者來說 ? ! 是最為頭疼的語法, 剛開始的時(shí)候建議利用Xocde的語法提示來解決? !的問題*///var number: Optional = nil//var number2: Int = nilletnumber:Optional =10print(number!)letnumber2 =10letsum = number! + number2letnumber3:Int? =55print(number3)/*

可選類型注意點(diǎn):

* 在開發(fā)中一般情況下盡量不要強(qiáng)制解包一個(gè)可選類型, 否則會(huì)引發(fā)錯(cuò)誤

*///let url = NSURL(string: "http://baidu.com")//print(url)//let request = NSURLRequest(URL: url!)leturl =NSURL(string:"http://baidu.com")print(url)//let request = NSURLRequest(URL: url!)ifurl !=nil{letrequest =NSURLRequest(URL: url!)}

可選綁定

// 可選綁定: 如果url不為nil, 系統(tǒng)內(nèi)部就會(huì)自動(dòng)將解包之后的值賦值給temp, 并且只有temp有值時(shí)才會(huì)執(zhí)行{}中的代碼// Swift開發(fā)中推薦這種寫法iflettemp = url{letrequest =NSURLRequest(URL: temp)}

5尺栖、數(shù)組

OC

可變于不可變NSArray/NSMutableArray空數(shù)組:NSArray*arr1 = [NSArrayarray];NSArray*arr2 = @[];有值數(shù)組:NSArray*arr1 = [NSArrayarrayWithObjects:@1, @2, @3,nil];NSArray*arr2 = @[@1, @2, @3];

swift

數(shù)組中保存的對象類型

// 數(shù)組中保存的都是字符串letarr = ["zhangsan","lisi"]// 數(shù)組中保存的是 NSObjectletarr1 = ["zhangsan",1]

*階段性小結(jié)*數(shù)組使用 [] 定義,這一點(diǎn)與 OC 相同*如果初始化時(shí)烦租,所有內(nèi)容類型一致延赌,擇數(shù)組中保存的是該類型的內(nèi)容*如果初始化時(shí),所有內(nèi)容類型不一致叉橱,擇數(shù)組中保存的是`NSObject`

可變于不可變let/var空數(shù)組:vararr1 =Array()vararr2 = [Int]()vararr3 = []? 有值數(shù)組:vararr1:Array = [1,2,3]vararr2:Array= [1,2,3]vararr3: [Int] = [1,2,3]vararr4 = [1,2,3]* 階段性小結(jié)? ? * 如果定義數(shù)組時(shí)指定了保存對象的類型挫以,擇不能向數(shù)組中添加其他類型的內(nèi)容? ? * 可以使用 `[String]()`? ? * `let` 定義的數(shù)組是`不可變的`? ? * `var` 定義的數(shù)組是`可變的`

常見數(shù)組操作

// 定義只能保存字符串類型數(shù)組vararray: [String]// 初始化數(shù)組array = ["zhangsan"]// 添加元素array.append("lisi")print(array)// 刪除元素array.removeAtIndex(1)print(array)// 刪除所有元素array.removeAll(keepCapacity:true)print(array.capacity)// 注意數(shù)組容量的變化foriin0..<10{? ? array.append("\(i)")print("\(array)---\(array.capacity)")}// 實(shí)例化新的數(shù)組vararray2 = [String]()array2.append("1")array2.append("2")// 拼接數(shù)組array += array2print(array)// 更新arrayM[0...1] = ["a","b"]// 刪除//arrayM3.removeRange(Range(start: 0, end: 2))arrayM3.removeRange(0..<2)// 其實(shí)Range就是半閉區(qū)間

在Swift語言里,我們可以用快速枚舉(for-in

)的方式來遍歷整個(gè)數(shù)組的元素:

for(index, value)inenumerate(array) {println("Item\(index +1):\(value)")}下面是使用for-in遍歷數(shù)組里的元素:letnumberOfLegs = ["spider":8,"ant":6,"cat":4]for(animalName, legCount)innumberOfLegs {println("\(animalName)s have\(legCount)legs")}//spiders have 8 legs//ants have 6 legs//cats have 4 legs由于字典是無序的窃祝,因此迭代的順序不一定和插入順序相同掐松。

6、字典

/// 定義并實(shí)例化字典vardict = [String:AnyObject]()dict["name"] ="zhangsan"dict["age"] =18print(dict)// 設(shè)置相同 key,之前的數(shù)值會(huì)被覆蓋dict["name"] ="lisi"print(dict)// 刪除某一個(gè) keydict.removeValueForKey("age")print(dict)dict["title"] ="manager"print(dict)// 遍歷字典(k, v可以隨便寫)for(k, v)indict {print("\(k)--\(v)")}// 合并字典vardict2 = ["name":"wangwu","age":80,"title":"boss"]for(k, v)indict2 {? ? dict.updateValue(v, forKey: k)}print(dict)

7大磺、 字符串

在 Swift 中絕大多數(shù)的情況下抡句,推薦使用 String 類型

使用String的原因

* `String` 是一個(gè)結(jié)構(gòu)體,性能更高? * `String` 目前具有了絕大多數(shù)NSString的功能? * `String` 支持直接遍歷 * `NSString` 是一個(gè) `OC` 對象杠愧,性能略差 * `Swift` 提供了 `String` 和 `NSString` 之間的無縫轉(zhuǎn)換

遍歷字符串

letstr ="我要飛的更High"forsinstr {print(s)}

字符串拼接

letstr1 ="zhangsan"letstr2 ="lisi"leti =10print(str1 + str2)print("\(str1)\(str2)\(i)")

階段性小結(jié)

直接在""中使用\(變量名)的方式可以快速拼接字符串

小伙伴們再也不要考慮stringWithFormat了

格式化字符串

for_in0...10{letstr =String(format:"zhangsan - %04d", arguments: [arc4random_uniform(100)])print(str)}* 階段性小結(jié)? ? * 在實(shí)際開發(fā)中待榔,如果需要指定字符串格式,可以使用 `String(format:...)` 的方式? ? * 注意:后面的參數(shù)需要放在一個(gè)數(shù)組中

String & Range 的結(jié)合

以下是超級費(fèi)勁的代碼

letstr:String="我要飛的更High"varsubStr = str.substringWithRange(Range(start: str.startIndex, end: str.endIndex))print(subStr)

建議寫法

letstr1:NSString="我要飛的更High"print(str1.substringWithRange(NSMakeRange(0,3)))

8流济、函數(shù)

* swift 函數(shù)定義格式:func函數(shù)名稱(形參列表)->返回值類型? {? ? 代碼? }*Void== ()// 1.沒有參數(shù)沒有返回值funcsay()->Void{print("hi")}say()// 如果沒有返回值可以簡寫funcsay1()-> (){print("hi")}say1()funcsay2(){print("hi")}say2()// 2.有參數(shù)沒有返回值// Swift2.0開始, 會(huì)自動(dòng)將形參列表的第二個(gè)參數(shù)名稱作為標(biāo)簽// Swift2.0之前是沒有這個(gè)特性的, 在Swift2.0之前如果需要顯示標(biāo)簽需要在形參名稱前面加上#funcsum(num1: Int, num2: Int){print(num1 + num2)}sum(10, num2:20)// 添加標(biāo)簽, 添加外部參數(shù)// x/y稱之為外部參數(shù), a/b稱之為內(nèi)部參數(shù)funcsum2(x a: Int,y b: Int){print(a + b)}sum2(x:10, y:20)// Swift2.0之前的寫法, 只要加上#那么a/b既是外部參數(shù), 也是內(nèi)部參數(shù)//func sum2(#a: Int,#b: Int)//{//? ? print(a + b)//}//sum2(a: 10, b: 20)// 3.沒有參數(shù)有返回值funcgetNumber()->Int{return998}print(getNumber())// 4.有參數(shù)有返回值funcsum2(num1: Int, num2: Int)->Int{returnnum1 + num2}print(sum2(50, num2:50))// 內(nèi)部和外部參數(shù)/*

* 默認(rèn)情況下所有形參都是內(nèi)部參數(shù), 也就是說只能在函數(shù)內(nèi)部使用

* 從Swift2.0開始會(huì)自動(dòng)將形參列表的第二個(gè)參數(shù)名稱作為標(biāo)簽, 也就是說從第二個(gè)參數(shù)開始, 參數(shù)的名稱既是內(nèi)部參數(shù)又是外部參數(shù)

* 如何指定外部參數(shù)?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐锣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绳瘟,更是在濱河造成了極大的恐慌雕憔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽荧,死亡現(xiàn)場離奇詭異橘茉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姨丈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門畅卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蟋恬,你說我怎么就攤上這事翁潘。” “怎么了歼争?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵拜马,是天一觀的道長。 經(jīng)常有香客問我沐绒,道長俩莽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任乔遮,我火速辦了婚禮扮超,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹋肮。我一直安慰自己出刷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布坯辩。 她就那樣靜靜地躺著馁龟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆魔。 梳的紋絲不亂的頭發(fā)上坷檩,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天却音,我揣著相機(jī)與錄音,去河邊找鬼淌喻。 笑死僧家,一個(gè)胖子當(dāng)著我的面吹牛雀摘,可吹牛的內(nèi)容都是我干的裸删。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阵赠,長吁一口氣:“原來是場噩夢啊……” “哼涯塔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起清蚀,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匕荸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枷邪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榛搔,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年东揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了践惑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘶卧,死狀恐怖尔觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芥吟,我是刑警寧澤侦铜,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钟鸵,受9級特大地震影響钉稍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棺耍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一贡未、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烈掠,春花似錦羞秤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矫限,卻和暖如春哺哼,著一層夾襖步出監(jiān)牢的瞬間佩抹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工取董, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棍苹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓茵汰,卻偏偏與公主長得像枢里,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蹂午,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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