1.2? Swift到底是怎樣的一種語言
Swift是一門博采眾長的現(xiàn)代語言,在設計的過程中,Chris參考了Objective-C揍移、Rust、Haskell反肋、Ruby那伐、Python、C#等優(yōu)秀語言的特點石蔗,最終形成了目前Swift的語法特性罕邀。這也是為什么使用各種語言的程序員都能從Swift中找到自己熟悉的影子的原因。那么养距,Swift語言到底是一種怎樣的語言诉探。可以從下面幾方面初步了解一下Swift語言棍厌。
(1)Swift是面向?qū)ο蟮纳隹琛⒕幾g型語言竖席。編譯時底層需要通過LLVM生成本地代碼才能執(zhí)行,所以效率還是很高的阳液。
(2)Swift可以使用Cocoa和Cocoa Touch中的API怕敬。這也就意味著Swift與Objective-C一樣揣炕,擁有了一個強大的Framework Library帘皿。
(3)Swift吸取了很多編程語言的優(yōu)點,同時Swift又具備了很多動態(tài)語言的語法特性和交互方式畸陡,當然鹰溜,Swift本身是靜態(tài)語言。所以丁恭,Swift盡可能地在靜態(tài)語言和動態(tài)語言之間尋找平衡點曹动。
(4)既然說Swift是一種擁有動態(tài)特性的靜態(tài)語言,那么Swift自然就是一門類型安全的語言牲览。編譯器可以在編譯過程中檢測出類型異常墓陈。例如,如果你期望為一個字符串變量賦值第献,那么類型安全機制會阻止你為這個變量設置整數(shù)贡必。正是由于類型安全機制的存在,使開發(fā)者可以更早地發(fā)現(xiàn)并修復錯誤庸毫。
(5)支持各種高級語言特性仔拟,包括閉包、泛型飒赃、面向?qū)ο罄ā⒍喾祷刂怠㈩愋徒涌谠丶选⒃M炒事、集合等蔬顾。
(6)Swift能與Objective-C進行混合編程[ 這一點與Objective-C和C++的混合編程不同迄埃。這兩種語言的混合編程,代碼可以混合放在同一個文件中(.mm)踊餐。]藕漱,但代碼分屬不同的文件欲侮。
(7)全面支持Unicode編碼。也就是說肋联,可以用任何想用的字符作為變量名威蕉,例如,一個笑臉字符或漢字橄仍。圖1-1就是使用笑臉圖標和漢字作為變量名的一個典型例子韧涨。
(8)使分號(;)變成了可選的符號牍戚。通常的靜態(tài)語言,如Java虑粥、C#如孝。每條語句結(jié)束后,都會在最后加上“;”娩贷,而Swift的每條語句不需要加“第晰;”,當然彬祖,加上也沒問題茁瘦。只有在兩條或多條語句寫在同一行時才必須加“;”。
(9)簡化和增強了集合數(shù)據(jù)類型储笑。用過Java和C#的讀者知道甜熔。在這兩種語言中,各種集合類型不可謂不全突倍,但太多也有它不好的地方腔稀,就是不知道使用哪個。而且這些集合數(shù)據(jù)類型的功能也不夠強大羽历。在Swift語言中只提供了數(shù)組(Array)和字典(Dictionary)兩個集合數(shù)據(jù)類型焊虏。其中Array類似List的功能,可以修改窄陡、添加炕淮、替換和刪除數(shù)組元素。Dictionary類似Map的功能跳夭,用于存儲Key-Value風格的值涂圆。
(10)Swift可以通過元組實現(xiàn)函數(shù)返回多個值。這一功能在其他語言中需要通過返回一個對象或結(jié)構體(指針)來實現(xiàn)币叹。
(11)提供了優(yōu)雅的閉包解決方案润歉。例如,在排序函數(shù)sort中可以將函數(shù)作為參數(shù)值傳遞颈抚。下面的代碼是一種典型的寫法:
letarray1=?["X",?"A",?"1",?"2",?"Z"]
func?backwards(s1:?String,?s2:?String)?->Bool
{
return?s1>s2
}
vararray2=sort(array1,?backwards)
當然踩衩,更簡潔的寫法是var array2 = sort(["X", "A", "1", "2", "Z"] ) { $0 > $1 },如果讀者不明白這么寫是什么意思贩汉,那么就繼續(xù)往后看吧驱富!
(12)Swift語言中提供了一種可選變量(Optional)。主要是為了應對一個變量可能存在匹舞,也可以是nil的情況褐鸥。例如,將一個字符串(String)轉(zhuǎn)換為整數(shù)(Int)赐稽,但這個字符串是否可以成功轉(zhuǎn)換為整數(shù)呢叫榕?如果不確定浑侥,就返回一個可選變量。如果成功轉(zhuǎn)換晰绎,則返回正常的整數(shù)值寓落;如果轉(zhuǎn)換失敗,則返回nil荞下。實現(xiàn)的代碼如下:
letstr="126CB5"
letvalue=str.toInt()??//??value是一個可選常量(用let聲明是常量伶选,用var聲明是變量)
這時,value就是一個可選變量锄弱。要想判斷轉(zhuǎn)換是否成功考蕾,可以使用下面的代碼:
if?value
{
//??如果value是可選變量,引用時需要加上“!”会宪,
//?表示該選項變量中肯定有一個值
println(value!)
}
可選變量的引入解決了大部分需要顯式處理的異常,這部分工作也扔給編譯器去做了蚯窥。
(13)擁有不同意義的nil掸鹅。在Swift中的nil和Objective-C中的nil不同。在Objective-C中拦赠,nil是指向不存在對象的指針巍沙,而在Swift里,nil不是指針荷鼠,它表示特定類型的值不存在句携。所有類型的可選值都可以被設置為nil,不僅是對象類型允乐。
(14)Swift中沒有從語言層面支持異步和多核矮嫉,不過可以直接在Swift中復用GCD(Grand Central Dispatch)的API實現(xiàn)異步功能。
(15)Swift沒有一部處理機制牍疏〈浪瘢可能是認為有了可選變量,異常會很少使用鳞陨,所以未加入異常處理昨寞。