Swift
是蘋果2014年推出的全新的編程語言,它繼承了C語言、ObjC的特性,且克服了C語言的兼容性問題。Swift
發展過程當中不只保留了ObjC不少語法特性,它也借鑑了多種現代化語言的特色,在其中你能夠看到C#
、Java
、Javascript
、Python
等多種語言的影子。Swift2.0
,並在以後宣佈Swift
開源,除了支持iOS、OS X以外還將支持Linux。Swift
語言是蘋果強推的一種編程語言,將來可能會取代ObjC的地位。這裏不會從零基礎一點點剖析這門語言的語法,旨在幫助你們快速從ObjC
快速過渡到Swift
開發中,入門初學能夠參考The Swift Programming Language中文手冊和Swift系列學習推薦php
Xcode從6.0開始加入了Playground
代碼測試,能夠實時查看代碼執行結果,若是尚未Xcode6以上的,可使用在線Swift編譯網站調試:Swift在線編譯網站html
import Foundation /* Swift沒有main函數,默認從第一個非聲明語句開始執行,自上而下執行 */ println("Hello World!")
Swift
沒有main函數,第一個非聲明語句開始執行,表達式或者控制結構,類、結構體、枚舉和方法等屬於聲明語句。Swift
經過import
引入其餘類庫,和Python
語言的導入很像。Swift
語句不須要雙引號結尾(儘管加上也不報錯),除非一行包含多條語句,也和Python
有點相似。
Swift包含了C和ObjC語言中的全部基礎類型,還增長了一些高階類型git
Int
整形和UInt
無符號整形Float
和Double
浮點型Bool
布爾型Character
字符型String
字符串類型enum
和結構體類型struct
Array
數組Set
集合Dictionary
字典Tuple
元組Optinal
可選類型import Foundation var intValue:Int = 1 //經過var定義一個Int變量 var floatValue:Float = 1.0 //經過var定義一個Float變量 var doubleValue:Double = 2.0000 //經過var定義一個Double變量 var boolValue:Bool = true //經過var定義一個Bool變量,if語句中的條件只能是布爾類型 var charValue:Character = "c" //經過var定義一個Character變量 var strValue:String = "hello" //經過var定義一個String變量 let number:Int = 1 //let表示常量,值不能被修改 let numMax = Int.max //枚舉值,Int整形最大值9223372036854775807 let score = 96 //自動推導爲Int類型 let width = 10.32 //自動推導爲Double類型 let name = "Join" //自動推導爲String類型 let anotherPi = 3 + 0.14159 //表達式中同時出現了整數和浮點數,會被推測爲Double類型 /* println中經過的\(var或者let變量)進行格式化輸出 */ println("log some value: score = \(score)") //等價於println("log some value: score = " + String(score)) //Swift是強類型語言,不一樣類型變量不能運算,會報錯,但字面量除外 Error: -> let sum = intValue + floatValue Success: -> let sumNum = 1 + 1.2
Swift
經過var
進行變量定義,經過let
進行常量定義(這和JavaScript
相似)Swift
添加了類型推斷,對於賦值的常量或者變量會自動推斷其具體類型Swift
是強類型語言,不一樣的數據類型之間不能隱式轉化,若是須要轉化只能強制轉化- 在
Swift
中類型轉換直接經過其類型構造函數便可,下降了API的學習成本
//Array數組 //定義數組的幾種方式 var arrStr1:Array<String> = ["hello","world"] var arrStr2:[String] = ["hello","world"] var arrDouble1:[Double] = [] var arrDouble2 = [Double]() //追加元素 arrStr1 += ["Swift","Obj-C"] //arrStr1 = ["hello","world","Swift","Obj-C"] arrStr1.append("Swift") //arrStr1 = ["hello","world","Swift","Obj-C","Swift"] //修改元素,x...y表示[x,y]區間,是Swift語法特性 arrStr1[3...4] = ["Array","Change"] //arrStr1 = ["hello","world","Swift","Array","Change"] arrStr1[1] = "Nice" //arrStr1 = ["hello","Nice","Swift","Array","Change"] //刪除元素 arrStr1.removeAtIndex(1) //arrStr1 = ["hello","Swift","Array","Change"] //插入元素 arrStr1.insert("insert", atIndex: 2) //arrStr1 = ["hello","Swift","insert","Array","Change"] //Set集合 var setStr1:Set<String> = ["hello","world"] //定義集合,注意集合沒有數組的簡化格式 var setStr2:Set = [1,2] //自動推導類型爲Set<Int> setStr1.insert("!") //插入元素,不保證順序 setStr1.remove("!") //刪除元素 setStr1.contains("!") //判斷是否包含 //Dictionary字典 var dictIntToStr1:Dictionary<Int,String> = {200:"success", 404:"error"} var dictIntToStr2:[Int,String] = {200:"success", 404:"error"} var dictIntToStr3 = {200:"success", 404:"error"} //自動推導爲[Int,String]類型 dictIntToStr1[200] = "hahaha" //修改元素,經過key找到value,進行修改 dictIntToStr1[500] = "server" //添加元素 500:"server"
元組就像是不能修改的數組同樣,元組中的值是不能修改的,不過元組內的值可使任意類型,並不要求是相同類型,這一點和數組不一樣github
/** * 元組的基本用法 */ var point = (x:50, y:100) //自動推斷其類型:(Int,Int) point.x //能夠用相似於結構體的方式直接訪問元素,結果:50 point.y //結果:100 point.0 //也能夠採用相似數組的方式使用下標訪問,結果:50 point.1 //結果:100 //元組也能夠不指定元素名稱,訪問的時候只能使用下標 let frame:(Int,Int,Int,Float) = (0,0,100,100.0) println(frame) //結果:(0, 0, 100, 100.0) //注意下面的語句是錯誤的,若是指定了元組的類型則沒法指定元素名稱 Error: -> let frame:(Int,Int,Int,Int) = (x:0, y:0, width:100, height:100) var size = (width:100, 25) //僅僅給其中一個元素命名 size.width //結果:100 size.1 //結果:25 var httpStatus:(Int,String) = (200, "success") //元組的元素類型並不必定相同 var (status, description) = httpStatus //一次性賦值給多個變量,此時status=200,description="success" //接收元組的其中一個值忽略另外一個值使用"_"(注意在Swift中不少狀況下使用_忽略某個值或變量) var ( sta , _ ) = httpStatus println("sta = \(sta)") //結果:sta = 200
上面的類型定義的常量或變量初始化都必須有值,而可選類型暗示了常量或者變量能夠沒有值編程
/** * 可選類型基礎 */ var x:Float? //使用?聲明成一個可選類型,若是不賦值,默認爲nil x = 172.0 var y:Float = 60.0 //注意此句報錯,由於Int和Int?根本就是兩種不一樣的類型,在Swift中兩種不一樣的類型不能運算 Error: -> var z = x + y Success: -> var z = x! + y //使用!進行強制解包,獲得基本類型 //注意ageInt是Int可選類型而不是Int類型,由於String的toInt()方法並不能保證其必定能轉化爲Int類型 var age = "29" var ageInt = age.toInt() //ageInt是Int?可選類型 /** * 可選類型判斷 */ if ageInt == nil { println("ageInt = nil") } else { println("ageInt = \(ageInt!)") //注意這裏使用感嘆號!強制解析 } /** * 可選類型綁定 * 若是可選類型有值,則將值賦值給一個臨時變量或者常量(此時此變量或者常量接受的值已經不是可選類型) * 若是沒有值,則不執行此條件 */ if let newAge = ageInt{ //此時newAge能夠定義成常量也能夠定義成變量 println("newAge = \(newAge)") //注意這裏並不須要對newAge強制解包 } else { println("ageInt = nil") } /** * 隱式解析可選類型 */ var age:Int! = 0 //經過感嘆號聲明隱式解析可選類型,此後使用時雖然是可選類型可是不用強制解包 age = 29 var newAge:Int = age //不用強制解包直接賦值給Int類型(程序會自動解包) if var tempAge = age { println("tempAge=\(tempAge)") }else{ println("age=nil") }
Swift
中相似於Int
和Int?
並非同一種類型,不能進行相關運算,若是要運算只能用感嘆號解包;- 可選類型其本質,就是此類型內部存儲分爲
Some
和None
兩個部分,若是有值則存儲到Some
中,沒有值則爲None
,使用感嘆號強制解包的過程就是取出Some
部分;- 若是一個可選類型從第一次賦值以後就能保證有值,那麼使用時就沒必要進行強制解包了,這種狀況下可使用隱式可選解析類型