1.1 Swift基本語法
接觸 一個新語言就先從
println("Hello World")
開始
1.1.1 常量和變量
在Swift中用var
關鍵字聲明一個變量,而聲明常量則用let
關鍵字。這樣的聲明規則適用于Swift中所有的數據類型,這點與Objective-C有差別。在Swift中,一個對象的可變版本與b不可變版本具有相同的類型——并不是子類(subclass)的關系。
注意:Swift中的所有的數據類型是有三種不同的數據結構中某一種實現的。1. 枚舉(enum) 2.結構體(struct) 3. 類(class)。在代碼中這些數據類型的傳遞方式也不同。
** 枚舉和 結構體在代碼中以值的方式進行傳遞**。即創建原始對象的副本并對其賦值,對原始或者副本對象的修改、刪除操作不會影響到另外一個。
類是通過引用的方式進行傳遞的。即將指向原始變量的指針賦值給新的變量,無論修改哪個變量,另一個變量也會受到影響。
Swift一門強類型語言,每一個變量的類型在編譯時期就已經確定了,并且在其整個生命周期里只能存儲固定類型的值
聲明變量var itemCount: int
,即是聲明了一個名為itemCount的Int類型變量。使用變量前,必須給變量設置一個初始值。其實在聲明時,就可以設置初始值,如var itemCount: int = 2
。
Swift還有個功能為類型推斷。如果編譯器能夠從初始值中獲取得足夠多的信息,進而推斷出初始值的類型。例如我們可以這樣聲明一個Int類型變量var itemCount = 2
。同理如果初始值設置為函數的返回值,編譯器會把變量的類型推斷為與函數返回值一直的類型。
1.1.2 字符串插值
利用字符串的插值操作,將變量、常量和其他表達式的值添加到輸出中。字符串插值為:在括號中包含一個變量或表達式,再用一個反斜杠進行轉義,最后將其直接添加到字符串中。例如:
var count = 99
println("there are \ (count) apples in your box")
//輸出:there are 99 apples in your box
字符串插值操作不僅僅適用于打印輸出,在使用字符串的任何地方都可以使用。
例如:
var firstName = "peng"
var lastName = "xiaoZhi"
var userName = " \ (firstName ) \ (lastName) \ (arc4random()%500)"
//userName: pengxiaoZhi255
1.1.3 流程控制
條件語句
Swift提供了if和switch兩種語法結構來有條件地執行代碼塊。
if語句與Objective-C相近,不過也有不同之處:
- if語句并非必須將檢測表達式放入括號中。
- 條件語句的代碼塊必須在大括號中。
- 檢測表達式的結果必須明確地為true或者flase,一個值為0的int變量并不會隱式的等價于false,其他的值也不會。
switch語句基于Objective-C,在Swift中它更加強大。不過我們也需要考慮兩個重要的區別。
第一:在Swift中必須覆蓋每一種可能出現的情況。default分支可以滿足這一要求。
第二:在Swift中當遇到下一個case分支開始時,switch語句會自動結束。
循環語句
與Objective-C類似,唯一不同的就是在語法表達上。
例:
//for循環
for var i = 0; i < 10; ++i{
println("i = \ (i)")
}
//for in
for i in 0 ..< 10{
println("i = \ (i)")
}//"..<"是半開區間運算符,它包含區間最左邊的值,但是不包含最右邊的值。“...”是閉區間運算符,它包括區間兩端的值。
迭代集合(例如數組)
var itemIds: [int] = generateItemIds()
for itenId in itemIds{
println("itemId :\ (itemId)")
}
while和do-while和Objective-C一樣,只是去掉了檢測表達式的括號。break和continue的效果完全一樣,break跳出當前循環,取消之后迭代。continue終止當前迭代,立即開始下一次迭代。
swift有一個Objective-C沒有的強大功能:給循環語句增加一個標簽(label),然后在內部循環中指定希望break或continue到哪個循環中。一個標簽由名稱之后跟著一個冒號構成,并且標簽位于循環語句關鍵字之前:
var folders: [SomeFolderClass] = foldersToProcess()
outer: for folder in folders{
inner: for file in folder{
if shouldCancle (){
break outer
}
file.process()
}
}
1.2 基本數據類型
1.2.1 整型
整型為Int。Int在32位設備中為32位整型,在64位設備中為64位整型。當需要特定長度時,可使用Int8、Int16、Int32或Int64。前面加一個U就是對應的無符號版本。
注:swift為強類型語言,代碼中不能隨意混合搭配使用Int的各種類型,并且不能在混合類型之間做數學運算和比較操作。
警告:當在設備間傳輸文件時,為了確保兼容性,寫入到文件中所有的整型變量都應該明確指定長度
1.2.2 Double和Float
swift代碼中,當需要使用小數時,可以使用Float和Double類型。Float是32位值,Double是64位值,這與設備的架構無關。當使用小數時,編譯器總是將其推斷為Double類型,而不是Float。因此,如果不需要64位的高精度,需要顯示地將變量聲明為Float。
1.2.3 布爾型
布爾型用于存儲布爾值,這與Objective-C非常相似,只不過swift使用的是true和false,而Object-C使用YES和NO。
注:在Objective-C中,許多類型都可以轉換為布爾類型。如果某種類型值存在內容,會轉換為YES,如果是空的,則轉換為NO。Swift則不同。在Swift中只有顯示地返回一個布爾類型才能被用于布爾值的聲明。在代碼中不能將布爾值與0或nil隱式地進行比較。
1.2.4 字符串
Swift中的字符串跟Objective-C中的有很大差別。
var str = "Hello World"
只需簡單的置于雙引號內即可。
String是Character類型值的集合。通過計算字符在內存中所占字節數判斷一個字符串的長度,在OC中是可以的。Swift中必須通過count()函數來判斷一個字符串中有多少個字符。Swift中的String也兼容OC中的NSString,由于兩者的實現方式有所不同,因此從NSString的length屬性得到的元素總數可能跟Swift中不盡相同。通過String的屬性utf16Count
獲得的值與NSString的length屬性才會相同。
Swift中兩個字符串拼接直接用+號。
注:不能直接將Character與String進行拼接。必須創建一個新的包含Character值的String在于其他String拼接。String(character) + str1
兩個字符串比較直接用==號返回true或false。
1.2.5 數組
在Swift中,聲明數組時必須指定數組包含的類型。一旦確定類型,數組中就只能包含確定的這一類型。
var dogs = ["ahuang","piqiu","heizi","wangcai","alv"]//每項的類型必須是相同的類型,否則會出現編譯錯誤
聲明時有兩種方法可以表示聲明的類型是一個數組:長形式和短形式。效果是一樣的,可以互換使用:
- 長形式:Array<ValueType>
- 短形式:[ValueType]
注:在Swift中創建一個不可變的數組時,無法對數組做添加、修改和刪除操作。不過可以修改數組中元素的屬性。
對數組進行訪問和修改的放法:
var array :[Int] = [1,2,3]
println(arrar.count) //輸出3,數組的個數
array.append(4) //[1,2,3,4] 末尾增加元素
arrar.insert(5,atIndex:0) //[5,1,2,3,4] 指定的位置增加元素
array.removeAtIndex(1) //[5,2,3,4] 刪除指定的元素
array.removeLast() //[5,2,3]刪除最后一個元素
array.removeAll() //[] 刪除所有元素
println(arrar.isEmpty) //ture 判斷數組是否為空
1.2.6 字典
字典的聲明方式跟數組一樣,也分為長形式和短形式,可以互換使用:
- 長形式:Dictionary<KeyType: ValueType>
- 短形式:[KeyType: ValueType]
聲明字典是,只要提供足夠多的信息,就可以使用類型推斷:var Dic = ["Jack":32, "Rose":28]
推斷這是一個[String:Int]類型。
使用count屬性可以判斷出字典的元素總個數。利用字典中的兩個數組屬性keys和values可以單獨對字典進行迭代。
數組跟字典都是集合的一種,可以使用for-in對兩個進行迭代。
以上就是第一章的內容,可能會有些繁瑣,主要是區別OC來講的。有些基本知識還是需要知道的,希望能成為學習Swift的入口。