iOS學習筆記41-Swift(一)基礎部分

1、Swift語言介紹

  • Swift是蘋果2014年推出的全新的編程語言,它繼承了C語言、ObjC的特性,且克服了C語言的兼容性問題。
  • Swift發展過程當中不只保留了ObjC不少語法特性,它也借鑑了多種現代化語言的特色,在其中你能夠看到C#JavaJavascriptPython等多種語言的影子。
  • 在2015年的WWDC上,蘋果還宣佈Swift的新版本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

2、Swift基礎部分

1. 第一個Swift程序
import Foundation
/* Swift沒有main函數,默認從第一個非聲明語句開始執行,自上而下執行 */
println("Hello World!")
  1. Swift沒有main函數,第一個非聲明語句開始執行,表達式或者控制結構,類、結構體、枚舉和方法等屬於聲明語句。
  2. Swift經過import引入其餘類庫,和Python語言的導入很像。
  3. Swift語句不須要雙引號結尾(儘管加上也不報錯),除非一行包含多條語句,也和Python有點相似。
2. 數據類型

Swift包含了C和ObjC語言中的全部基礎類型,還增長了一些高階類型git

  1. 基礎類型:
  • Int整形和UInt無符號整形
  • FloatDouble浮點型
  • Bool布爾型
  • Character字符型
  • String字符串類型
  1. 枚舉類型enum和結構體類型struct
  2. 集合類型
  • Array數組
  • Set集合
  • Dictionary字典
  1. 高階數據類型
  • Tuple元組
  • Optinal可選類型
3. 基礎類型使用
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
  1. Swift經過var進行變量定義,經過let進行常量定義(這和JavaScript相似)
  2. Swift添加了類型推斷,對於賦值的常量或者變量會自動推斷其具體類型
  3. Swift強類型語言,不一樣的數據類型之間不能隱式轉化,若是須要轉化只能強制轉化
  4. Swift中類型轉換直接經過其類型構造函數便可,下降了API的學習成本
4. 集合類型使用
//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"
5. 元組使用

元組就像是不能修改的數組同樣,元組中的值是不能修改的,不過元組內的值可使任意類型,並不要求是相同類型,這一點和數組不一樣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
6. 可選類型使用

上面的類型定義的常量或變量初始化都必須有值,而可選類型暗示了常量或者變量能夠沒有值編程

/**
 * 可選類型基礎
 */
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")
}
  1. Swift中相似於IntInt?並非同一種類型,不能進行相關運算,若是要運算只能用感嘆號解包;
  2. 可選類型其本質,就是此類型內部存儲分爲SomeNone兩個部分,若是有值則存儲到Some中,沒有值則爲None,使用感嘆號強制解包的過程就是取出Some部分;
  3. 若是一個可選類型從第一次賦值以後就能保證有值,那麼使用時就沒必要進行強制解包了,這種狀況下可使用隱式可選解析類型
相關文章
相關標籤/搜索