簡述
自從蘋果2014年發(fā)布Swift,到現(xiàn)在已經(jīng)兩年多了码邻,而Swift也來到了3.1的版本。最近利用工作之余另假,整理了一份簡單的入門教程像屋。
1.首先,作為一個程序員边篮,大家第一想到的是“Hello,World”己莺,下面闡述OC和Swift中分別是怎樣實現(xiàn)展示“Hello,World”奏甫。
OC:NSLog(@"Hello,World");
Swift: print("Hello,World")
通過上面兩個,我們就能清楚的知道篇恒,在Swift中扶檐,這行代碼就是一個完整的程序,我們不需要為了輸入輸出或者字符串處理導入一個單獨的庫胁艰,全局作用域中的代碼會被自動當做程序的入口點款筑,不需要main函數(shù),也不需要在每個語句結尾寫上分號腾么。
在這里順便插入一個Xcode的Playground奈梳,這是一個簡單易用的代碼預覽功能,在左側輸入代碼解虱,右邊立馬能展示效果攘须。
簡單值 let 和var
使用let申明常量,var申明變量殴泰,常量我們只能為它賦值一次于宙,編譯的時候我們并不需要獲取,可以使用多次悍汛,但是不能再次被賦值捞魁。變量是在程序運行過程中,多次被賦值的量离咐。
let myPlaygrounWidth = 20
var myChangeWidth = 30
myChangeWidth = 40
常量或者變量的類型必須和你給它們的值保持一致谱俭,但是,你可以不用明確地聲明類型宵蛀,如果在聲明的同時賦值的話昆著,編譯器會自動推斷類型。例如如下語句:
var age = 10
let string = "myString"
根據(jù)所賦的值术陶,編譯器會自動推斷age為整型凑懂,string為字符串(String)類型,但是你也可以顯式指定類型:
let myString:NSString = "This is String"
但是值永遠不會隱式轉換其他類型瞳别,如果你需要一個值轉換成其他類型征候,必須顯式轉換。
let testView = "The Height is"
let height = 80
let testViewHeight = testView + String(height)
當你取消那個String時候就會報錯:不會隱式轉換其他類型
let testViewHeight2 = testView + height
當然有一個更方便的轉換字符串的方法:右斜杠(值)
let testViewHeight3 = "testView + \(height)"
數(shù)組和字典
數(shù)組
數(shù)組在一個有序鏈表存儲了多個類型相同的值祟敛,同一個值可以在數(shù)組的不同位置多次出現(xiàn)。Swift的數(shù)組對它們能存儲的值的類型是明確的兆解,不同于OC中NSArray和NSMutableArray馆铁,OC數(shù)組能存儲任何類型的對象,并且不提供關于這些對象自身的任何信息锅睛,在Swift中埠巨,任何一個特定的數(shù)組所存儲的值历谍,類型總會被確定下來,要么顯式說明辣垒,或者通過類型推斷望侈。如果你創(chuàng)建了一個Int類型數(shù)組,你就不能存儲任何非Int類型的值插入數(shù)組勋桶。
1.數(shù)組的創(chuàng)建
var gameStringArray = ["one","two","three"]
var gameShowArray:[String] = ["stringOne","stringTwo","stringThree"]
var gameArray = ["one","two","three",1](會報錯)
var gameInteArray:[Int] = [1,2,"string"](會報錯)
因為當你顯式的決定了數(shù)組的值的類型就不能再插入其他非這指定類型的值脱衙,但是當并非顯式?jīng)Q定時候可以后面添加as[Any]泛指各種類型,如下所示:
var gameArray = ["one","two","three",1] as [Any]
2.數(shù)組的存取和修改
數(shù)組的取值還是和OC差不多例驹,可以通過索引取值
gameStringArray[1] gameStringArray[2]
當你數(shù)組越界時候會提示報錯如下所示:
數(shù)組的簡單add捐韩、insert、remove和OC差不多鹃锈,只是語法的不同,如下所示:
var gameStringArray = ["one","two","three"] //["one", "two", "three"]
gameStringArray.append("addString") //["one", "two", "three", "addString"]
gameStringArray.insert("insertString", at: 1) //["one", "insertString", "two", "three", "addString
gameStringArray.remove(at: 2) //"two"
print(gameStringArray) // "["one", "insertString", "three", "addString"]\n"
你也可以一次性修改指定范圍的值荤胁,即使將要替換掉的元素的數(shù)量和將要替換成的元素的數(shù)量不一樣,也都可以正確使用屎债,如下所示:
gameStringArray[1...3] = ["changeString","ChangeString2"] //"["one", "changeString", "ChangeString2"]\n"
字典(Dictionary)
字典是一種存儲多個類型相同的值的容器仅政,每個值都和一個唯一的Key(鍵)相對應,這個key在字典中就是其對應值的唯一標識盆驹,和數(shù)組不同圆丹,字典里的元素沒有順序。Swift的字典對它們能存放的鍵和值的類型是明確的召娜。這不同于Objective-C的NSDictionary類和NSMutableDictionary類运褪,Objective-C的字典能存儲任何類型的對象作為鍵或值,并且不提供關于這些對象自身的任何信息玖瘸。在Swift里秸讹,任何一個特定的字典鍵和值,其類型總會被確定下來雅倒,或者通過顯式的類型說明璃诀,或者通過類型推斷
1.字典的初始化
var dictionary = ["Ch":"China","DB":"Dublin"]
var showDic:Dictionary<String,String> = ["Ch":"China","DB":"Dublin","test":"\(1)"] //假如直接寫1會報錯,顯式?jīng)Q定了類型
2.字典的存取和修改
dictionary["Ch"] //"China" 如果字典有就是取值
dictionary["Ch"] = "Chinese" //修改value
print(dictionary) //"["DB": "Dublin", "Ch": "Chinese"]\n"
dictionary.updateValue("Ch", forKey: "Updata") //擁有key就是修改 沒有就相當于添加
dictionary.removeValue(forKey: "Ch") //移除 當字典中沒有這個key時候為nil 但是在OC中會報錯閃退
數(shù)組和字典的可變性
數(shù)組和字典都把多個值存放在一個集合里蔑匣。如果你創(chuàng)建了一個數(shù)組或者字典劣欢,并且將之指定為變量,那么該集合就是可變的裁良,這意味著在集合被創(chuàng)建后凿将,可以通過增加或刪除元素來改變集合的容量大小。相反地价脾,如果你指定一個數(shù)組或字典為常量牧抵,那么該數(shù)組或字典就是不可變的,其容量大小不能被改變。
對字典來說犀变,不可變還意味著你不能改變字典里某個鍵的值妹孙。一個不可變的字典一旦被設置值后,它里面的內容就不能再改變获枝。
但是蠢正,數(shù)組的不可變性跟字典略有不同。盡管你不能進行任何可能會改變數(shù)組大小的操作省店,但是你可以給數(shù)組中的某個索引設置一個新的值嚣崭。這使得Swift的數(shù)組在大小固定的情況下能夠達到最佳的性能。
控制流
使用if和switch來進行條件操作萨西,使用for-in有鹿、for、while和do-while來進行循環(huán)
1.for循環(huán) 在相對OC來說 Swift的功能強大谎脯,慢慢棄用了C語言的
for (<#initialization#>; <#condition#>; <#increment#>) { <#statements#> }
Swift For循環(huán)如下所示:
var nameArray = ["張三","李四","王五","趙六"]
for string in nameArray {
print(string)
}
for index in 1..<10 {
print(index)
// 打印結果為1-9
}
for index in 1...10 {
print(index)
//打印結果為1-10
}
for index in nameArray.reversed() {
print(index)
//打印結果相反 倒序
}
for (index,i) in nameArray.enumerated() {
print(index) //遍歷索引
print(i) //遍歷元素
}
2.if else
在if語句中葱跋,條件必須是一個布爾表達式——這意味著像if score { ... }這樣的代碼將報錯,而不會隱形地與 0 做對比源梭。
你可以一起使用if和let來處理值缺失的情況娱俺。這些值可由可選值來代表。一個可選的值是一個具體的值或者是nil以表示值缺失废麻。在類型后面加一個問號來標記這個變量的值是可選的荠卷。具體寫法和OC差不多,少了條件的括號
var score = 50
if score > 20{
}else
{
score += 1
}
3.while
var x = 2
while x < 10 {
x = x + 2
}
var m = 2
repeat { //do 改成了repeat
m = m * 2
} while m < 10
函數(shù)和閉包
//定義一個傳入兩個String返回為String的函數(shù)
func test(name:String,eat:String) ->String{
return "Today\(name)eat \(eat)"
}
//函數(shù)調用
test(name: "張三", eat: "ice")
//定義一個傳入key 和value 返回一個字典的函數(shù)
func redictionary(key:String,value:String) -> Dictionary<String,String>
{
var dic = [String:String]()
dic[key] = value
return dic
}
//函數(shù)調用
print(redictionary(key: "myName", value: "Hou"))
var myDic:Dictionary<String,String> = redictionary(key: "myTest", value: "Test")
//函數(shù)的參數(shù)是可變的烛愧,可以不傳油宜,也可以多個(求平均數(shù))
func getAverage(numbers:Int...) -> Float
{
var sum = 0
let count = numbers.count
for number in numbers {
sum += number
}
let result = sum / count
return Float(result)
}
print(getAverage(numbers: 12,22,33))