相關文章?
[Swift快速入門(一)第一個Swift程序](http://blog.csdn.net/itachi85/article/details/50531727)
**1.變量和常量**
#### 聲明常量和變量
Swfit是強類型的語言,Swift要求所有的變量和常量必須先聲明后使用。?
聲明變量需要使用var,聲明常量則需要使用let
~~~
var 變量名[:類型] =初始值
let 常量名[:類型] =初始值
~~~
下面來進行舉例:
~~~
// 聲明變量時顯式指定類型
var age : Int
// 聲明變量時指定初始值,編譯器會根據初始值確定該變量的類型為String
var game= "九陰真經"
// 顯式指定的類型與初始值的類型一致,聲明變量正確
var age1: Int = 30;
// 顯式指定的類型與初始值的類型不一致,聲明變量失敗
var game1 : String = 500;
// 定義常量,沒有顯式指定類型,編譯器根據初始值確定常量的類型
let maxAge = 120
// 定義常量時,既顯式指定常量的類型,也指定常量的初始值
let game2: String = "九陰真經"
~~~
#### 輸出常量和變量
可以用print函數來輸出當前常量或變量的值:
~~~
print(game) //九陰真經
~~~
Swift 用字符串插值(string interpolation)的方式把常量名或者變量名當做占位符加入到長字符串中,Swift 會用當前常量或變量的值替換這些占位符。將常量或變量名放入圓括號中,并在開括號前使用反斜杠將其轉義:
~~~
print("game的值為:\(game)") //game的值為:九陰真經
~~~
**2.整型**
整數就是沒有小數部分的數字,比如23和-23。整數可以是有符號(正、負、零)或者無符號(正、零)。?
Swift 提供了8,16,32和64位的有符號和無符號整數類型。這些整數類型和 C 語言的命名方式很像,比如8位無符號整數類型是UInt8,32位有符號整數類型是Int32。就像 Swift 的其他類型一樣,整數類型采用大寫命名法。
####整型范圍
你可以訪問不同整數類型的min和max屬性來獲取對應類型的最大值和最小值:
~~~
let minValue = UInt8.min // minValue為 0
let maxValue = UInt8.max // maxValue為 255
~~~
####Int型與UInt型
Int型占的內存和當前的平臺原生字長相同:對于32位平臺,Int型與Int32型的長度相同,對于64位平臺,Int型與Int64型的長度相同。此外Swift還支持對無符號整數的支持。但是盡量不要使用UInt,除非你真的需要存儲一個和當前平臺原生字長相同的無符號整數。除了這種情況,最好使用Int,即使你要存儲的值已知是非負的。統一使用Int可以提高代碼的可復用性,避免不同類型數字之間的轉換,并且匹配數字的類型推測。即使是在32位平臺上,Int可以存儲的整數范圍也可以達到-2147483648~2147483647,大多數時候這已經足夠大了。
####整數數值表現形式
Swift整數數值有4種表示方式:
* 十進制:默認的就是十進制整數。
* 二進制:以0b開頭的整數。
* 八進制:以0o開頭的整數。
* 十六進制: 以0x開頭的整數。
~~~
let decimalInteger = 17
let binaryInteger = 0b10001 // 二進制的17
let octalInteger = 0o21 // 八進制的17
let hexadecimalInteger = 0x11 // 十六進制的17
~~~
**3.浮點型**
浮點類型比整數類型表示的范圍更大,可以存儲比Int類型更大或者更小的數字。Swift 提供了兩種有符號浮點數類型:?
Double表示64位浮點數。當你需要存儲很大或者很高精度的浮點數時請使用此類型。?
Float表示32位浮點數。精度要求不高的話可以使用此類型。
#### 浮點數值表現形式
Swift的浮點數有3中表現形式:
* 十進制形式:這種形式就是平常簡單的浮點數,例如 2.23,50.0。浮點數必須包含一個小數點,否則會被當作整數類型處理。
* 科學計數形式:例如2.23e2(2.23×102),2.23E2(2.23×102)。
* 十六進制數形式:這種形式的浮點數必須以0x開頭,且需要使用p來代表指數部分,例如0x2.a2p2(0x2.a2×102)
**4.數值型類型轉換**
####整型之間的轉換
不同整數類型的變量和常量可以存儲不同范圍的數字。Int8類型的常量或者變量可以存儲的數字范圍是-128~127,而UInt8類型的常量或者變量能存儲的數字范圍是0~255。如果數字超出了常量或者變量可存儲的范圍,編譯的時候會報錯:
~~~
// UInt 類型不能存儲負數,所以會報錯
let age: UInt = -1
// Int8 類型不能存儲超過最大值的數,所以會報錯
let big: Int8 = Int8.max + 1
~~~
要將一種數字類型轉換成另一種,你要用當前值來初始化一個期望類型的新數字,這個數字的類型就是你的目標類型。在下面的例子中,常量two是UInt16類型,然而常量one是Uint8類型。它們不能直接相加,因為它們類型不同。所以要調用UInt16(one)來創建一個新的UInt16數字并用one的值來初始化,然后使用這個新數字來計算:
~~~
let two: UInt16 = 2
let one: UInt8 = 1
let third= two+ UInt16(one)
~~~
####整數和浮點數轉換
整數和浮點數的轉換必須顯式指定類型:
~~~
let three = 3
let point = 0.141596
let add= Double(three) + point // add等于3.14159,所以被推測為 Double 類型
~~~
當進行類型轉換時要盡量向表數范圍大的數據類型轉換,這樣的程序更安全些,而反過來轉換可能會導致運行時的錯誤。Swift各種數值型表數范圍由小到大順序:Int8—Int16—Int32—Int64—Float—Double
**5.布爾型**
Swift有一個基本的布爾(Boolean)類型,叫做Bool,它的數值只能是true和false,不能用0或者是非0來代表。其他的數據類型也不能轉換成Bool類型。
~~~
var isGame= true
var isShow= false
~~~
字符串”true”和”false”不會直接轉換成Bool類型,但Bool類型變量可以插值到字符串中:
~~~
var str:String="\(isGame)是真的"
print(str)
~~~
**6.元組類型**
####定義元組類型變量
元組(tuples)把多個值組合成一個復合值。元組內的值可以使任意類型,并不要求是相同類型。
~~~
// 定義元組變量,并指定初始值,系統推斷該元組類型為(Int, Int, String)
var game= (1, 2 , "九陰真經")
// 使用元組類型來定義元組變量
var score : (Int , Int , String , Double)
// 為元組變量賦值時必須為所有成員都指定值
score = (98 , 89 , "及格" , 20.4)
~~~
元組類型的成員可以再次是元組:
~~~
var test : (Int , (Int , String))
test = (20 , (15 , "大航海時代"))
~~~
輸出元組:
~~~
print("game元組的值為:\(game)")
print("score元組的值為:\(score)")
print("test元組的值為:\(test)")
~~~
####獲取元組中的元素值
Swift允許通過下表來訪問元組的單個元素,元組的下標從0開始。
~~~
print("game元組的排名元素為:\(game.0)")
print("game元組的名稱元素為:\(game.2)")
print("test元組的第2個元素的第2個元素為:\(test.1.2)")
~~~
####為元組中的元素命名
定義元組時也可以使用key:value的形式來定義元組,這種形式相當于為每個元素都指定了名字,并且指定名字有更好的可讀性:
~~~
// 使用元組類型來定義元組變量
var score : (java:Int , swift:Int , oc:String , ruby:Double)
// 簡單為每個元素指定值,此時必須按順序為每個元素指定值
score = (99 , 60 , "及格" , 20.1)
// 通過key為元組的元素指定值,在這種方式下,元組內各元素的順序可以調換
score = (oc:"及格" , swift:60 , java:99 , ruby:20.1)
~~~
**7.可選類型**
####可選類型與值缺失
在任何已有類型的后面緊跟?就可以代表是可選類型,可選類型的變量用于處理“值缺失”。?
我門先來看看如下代碼:
~~~
var str = "九陰真經"
var num :Int = str.toInt()//會報錯
var num1: Int? = str.toInt()//正確的代碼
~~~
第二行代碼會報錯,因為“九陰真經”這個String類型無法轉換成Int類型,如果str等于數字型的字符串則會轉換成功(如var str = “11”)。轉換失敗時,我們無法返回Int值,這就是”值缺失”的情況,因此在這里必須使用Int?類型的變量來儲存轉換結果,所以第三行代碼是正確的。?
Swfit用nil來代表”值缺失”,因此上面的num1變量的值為nil。?
需要注意的是,只有可選類型的變量和常量才能接收nil,非可選類型的變量和常量不能接收nil。
####強制解析
Int?類型與Int類型不是相同的類型,程序不能把Int?類型的值當作Int類型的。為了獲取可選類型的實際存儲的值,我們可以在可選類型的值后面加上“!”號。這個嘆號表明:已知該可選變量有值,請提取其中的值,這種添加嘆號進行解析的方法稱之為強制解析。
~~~
var str : String? = "九陰真經"
// str是String?類型的,不能賦值給String類型的s變量
var s : String = str//會報錯
~~~
上面的例子會報錯,如果我們這樣寫則不會有問題:
~~~
var s : String = str!
print(s)
~~~
強制解析必須是可選類型的變量或者常量確實有值時才能夠解析成功,否則會報錯。為了去報強制解析不會導致運行是錯誤,Swift提供了if語句來判斷可選類型是否有值,因此上面的語句改為如下的形式比較合適:
~~~
var str : String? = "九陰真經"
if str != nil
{
// 該值是String類型,因此可賦值給String類型的s變量
var s : String = str!
print(s)
}else{
print("str為nil,不能強制解析")
}
~~~
####隱式可選類型
隱式可選就是在任意的已有類型后面添加“!”。拿Int類型舉例,Int?和Int!的區別就是:當程序獲取Int?類型的值時,程序必須在變量名后添加“!”后綴來進行強制解析,而Int!則不需要,Swift會自動的執行隱式解析:
~~~
var s1: String? = "九陰真經"
// 對于String?可選類型,必須使用感嘆號執行強制解析
var tmp : String = s1!
var s2 : String! = "大航海時代"
// 對于String!隱式可選類型,無需使用感嘆號執行強制解析
var tmp2 : String = s2
~~~
需要注意的是隱式可選類型的值如果沒有值的情況下,如果程序嘗試獲取該值同樣會導致運行時錯誤,和強制解析一樣,我們用if語句來判斷隱式可選類型是否有值:
~~~
var str : String! = "大航海時代"
if str != nil {
// 對于String!隱式可選類型,無需使用感嘆號執行強制解析
var s : String = str
print(s)
}else{
print("s為nil,不能強制解析")
}
~~~
####可選綁定
可選綁定用來判斷可選是否包含值,如果包含就把值賦給一個臨時常量或者變量。可選綁定一般用在 if 和 while 語句中,對可選的值進行判斷并把值賦給一個常量或者變量。
~~~
var str : String! = "九陰真經"
// 如果可選變量str有值,將值賦值給tmp變量。
if var tmp = str
{
print("str的值為:\(tmp)")
}else{
print("str的值為nil,不能解析!")
}
~~~
**8.字符和字符串**
Swift使用Character來代表字符,String來代表字符串,字符串表示一個有序的字符集合。
####字符類型
Swift采用Unicode字符集來存儲字符,字符必須使用雙引號來包起來。?
定義字符型的值有三種表示形式:
* 直接通過單個字符來指定字符常量,如“A”,”3”。
* 通過轉義字符表示特殊字符常量,如“\n”,”\r”。
* 使用\u{n}的Unicode形式,其中n代表一個1~8的十六進制數。
swift常用的轉義字符:?
\0 空字符?
\ 反斜杠?
\ t 制表符?
\n 換行符?
\r 回車符?
\” 雙引號?
\’ 單引號
####字符串類型
創建字符串:
~~~
var str="九陰真經"
var name:String="九陰真經"
~~~
字符串其實是一個結構體,因此我們可以調用結構體的構造器來創建字符串:
~~~
var str=String()//創建空字符串
var str=String("九陰真經")
~~~
####字符串可變性
在oc中有NSSting和NSMutableString來分別表示不可變和可變的字符串,Swift中只提供了String類型,Swift通過常量和變量來區分字符串是否可變:
~~~
var mutableStr="可變字符串"
let immutableStr="不可變字符串"
~~~
####字符串比較
Swift提供了3種方式來比較字符串:
* 字符串相等 ==
* 前綴相等 hasPrefix()
* 后綴相等 hasSuffix()
~~~
var str="jiuyinzhenjing"
var hasPrefix:Bool=str.hasPrefix("jiu")
print(hasPrefix)//結果為true
~~~
**9.類型別名**
Swift提供了類型別名為已有類型指定另一個名字,用typealias來定義類型別名:
~~~
typealias UintMin=Unit16
var max=UintMin.max//相當于取Unit16類型的最大值
print(max)//結果為65535
~~~
在這里不建議用類型別名,會使程序可讀性降低。