原文地址css
在過去的幾年中,移動應用程序風靡全世界而且已經改變了咱們使用互聯網進行工做或者休閒的方式。爲了建立移動應用程序,各類技術應運而生,同時開發過程也開始將其做爲一等公民來對待。儘管移動彷佛已經無處不在了,可是它的將來纔剛剛開始。咱們正面對着新一代的移動設備,例如可穿戴設備以及組成物聯網的大量移動工具。咱們將會面對新的用來展現數據和接受命令的用戶界面。同時,咱們將會看到愈來愈多的公司真正地實現移動優先。全部的這一切都將會影響咱們在將來的幾年中設計、開發和測試軟件的方式。html
蘋果公司在 WWDC 2014 上發佈全新開發語言 Swift——一門針對 iOS 和 OS X 開發的編程語言。不要將蘋果的 Swift 與老的並行腳本語言混淆。Swift 的目標是讓 iOS 和 OS X 開發變得更簡單,更有樂趣。在本文中,我將會解釋我認爲Swift所具備的最具殺傷力的五個特性,以及爲何會這樣認爲的緣由,雖然這些特性如今依然處於測試階段,但卻值得一試。編程
蘋果已經擁有了一門編程語言——Objective-C。那麼爲何還要引入另外一門編程語言呢?這是由於,雖然 Objective-C 在被建立之初很是獨特,同時也很先進,但如今再看,它沒有當今語言的味道。例如,在消費者方面,像 Ruby 這樣的腳本語言已經被普遍採用,很大程度上得益於它乾淨的語法。在企業領域,具備類型推理能力的強類型(類型安全的)語言更受歡迎。爲了將函數式編程語言所具備的函數即對象、Lambda 表達式等經典特性引進來,C# 和 Java(或者 Scala)等語言都作出了大量的努力。Objective-C 一直都缺乏這類東西,而 Swift 正是爲了填補這個空白。swift
Objective-C 是擴充 C 的面向對象編程語言。用於編寫 iOS 和 Mac OS X 的操做系統及其應用程序。是 1980 年代初布萊德·考克斯(Brad Cox)在其公司 Stepstone 發明 Objective-C。Objective-C 的流行歸功於 iPhone 的成功。數組
這並非說 Objective-C 不是一門優秀的編程語言。實際上,它是一門優秀的語言。可是我確實看到有足夠的空間能夠成功地替代 Objective-C。進一步講,同時也要感謝 Swift 的優秀,我認爲 Swift 必定會像野火那樣迅速蔓延開來。安全
如今,就讓咱們看看 Swift 都提供了什麼。從語言角度,Swift 很是了不得。蘋果借鑑了 Objective-C,Javascript,Python,Scala 和 C# 這些現代語言的優勢,構建了一門很是簡單,功能很是強大的語言。它很是完美地融合了面向對象和函數式編程範式——說 Swift 是一門函數式語言,是一種極大的延伸。下面就讓咱們看看 Swift 最具殺傷力的5個特性。app
從語法上講,Swift 很是華麗。它是一門很是簡單、乾淨的語言,同時可讀性也很是好,即便以如今的標準來衡量也是如此。你立刻就會發如今設計一門語言的時候簡單性是一個關鍵要素。例如,你們所熟知的語句末尾的分號。蘋果決定將分號做爲可選的,雖然這看起來相關性並非很是強,可是它卻讓咱們看到了蘋果爲了儘量地保持語法乾淨所作出的努力。編程語言
簡單性方面的其餘例子包括字符串插入,以及對數組和循環的支持。ide
字符串插入函數式編程
var message = "Hello World"
"The message is \(message)" //The message is Hello world
var a = 1, b = 2
"The sum is \(a + b)" //The sum is 3
循環
var length = 10
for i in 0..
數組
var list = ["a", "b"]
list += ["c", "d"]
以上僅僅是 Swift 爲簡單性提供支持的一部分示例。須要注意的是,你依然可使用 Array 類的「append」方法鏈接數組,而蘋果之因此走了額外的一英里將其構建爲語言的一部分目的是爲了展現他們設計 Swift 的目標。
若是你想學習 Swift,那麼能夠嘗試下 Xcode 6,它的代碼實時預覽(Playground)功能太酷了,簡直沒法用語言形容。實時預覽功能讓你可以實時地隨着你的輸入對代碼進行測試。它會執行你在開發環境中輸入的全部內容,提供與變量值、函數調用返回值以及特定代碼塊被執行的次數相關的詳細信息。
愈來愈多的語言將函數做爲一等公民並支持高階函數。例如,最近發佈的 Java 8 引入了 Lambda 表達式。它的理念很簡單,就是函數的參數是函數,同時,也能夠將函數做爲返回值。這樣就能夠支持更多的抽象。例如,咱們能夠將一個「過濾(filter)」函數應用到一個數組,該過濾函數接受數組中的每個條目做爲參數,經過特定的標準對條目進行斷定從而完成對給定數組的過濾。使用更加通用的方法的關鍵是可以接受函數類型的參數。下面就讓咱們看看定義函數的語法。
Swift 定義函數的語法與傳統的 Haskell 這樣的函數型語言類似,但並不徹底同樣。箭頭(->)的左邊是參數以及參數的類型,右邊是返回值類型。在下面示例中,咱們想要過濾一個數字列表,基於一個給定的數字,返回一個 Bool 類型。這樣,函數看起來多是這樣的:
(Item:Int) -> Bool
這段代碼的含義是,接受一個 Int 類型的參數,返回一個 Bool 類型的值。很顯然,你能夠包含多個參數,可是不太明顯的是,你還能夠返回多個值,而這不須要建立一個容器對象。在後面的示例中,函數會返回一個元組 。
一個過濾整數的函數定義多是這樣:
func bigNumbersOnly (item:Int) -> Bool {
return item > 3
}
如今,咱們已經建立了本身的過濾函數,下面讓咱們看看能夠接受函數參數類型的「filter」函數。
var numbers = [1, 2, 3, 4, 5]
var bigOnes = numbers.filter(bigNumbersOnly)
在這個示例中,filter 是一個高階函數,由於它的參數類型是函數。在 Swift 中,函數也是對象,這意味着咱們能夠定義內聯函數:
var numbers = [1, 2, 3, 4, 5]
var bigOnes = numbers.filter({(item:Int) -> Bool in return item > 3})
或者咱們也能夠將函數賦值給某個變量,稍後再使用它:
//define two variables of type function
var biggies = {(item:Int) -> Bool in return item > 3 }
var threes = {(item:Int) -> Bool in return item == 3 }
//decide which one to apply at runtime
var result = numbers.filter(onlyThrees ? threes : biggies)
當今,將函數做爲對象,讓用戶可以像使用參數那樣引用、傳遞函數已經成爲一種優美的標準。而 Swift 實現方式的簡潔性依然是一個值得稱道的地方,這一核心概念配合類型推理可讓你事半功倍。
在企業開發領域,咱們很是習慣於使用強類型(或者說類型安全的)語言。強類型語言一般會給咱們帶來一點額外的自信,由於它可以在編譯時進行錯誤檢查,若是這些語言也可以支持類型推理那麼將會是一種很是好的體驗。例如,能夠這樣:
//Without Type inference
var x:String = "bar"
//With Type inference
var y = "bar"
注意,第二行的語句並無聲明變量的類型。由於,Swift 知道「bar」是一個字符串,因此不須要顯式地定義它的類型,固然咱們也能夠指定,像第一個語句那樣。這看起來好像並無特別大的做用,但若是推理的是函數的類型那麼它就會變得十分有趣。
若是不使用類型,咱們該如何定義以前例子中的函數呢?下面的代碼展示了 Swift 的實現:
//$0 will map to the first parameter, $1 to the second...
var result = numbers.filter({ return $0 == 3})
沒有比這更簡潔的了!若是你的參數不止一個,同時想要經過名字引用參數,那麼能夠這樣作:
{a, b in return a > b }
Swift 提供的另外一個很是便利的特性是泛型。在企業開發領域,泛型首先被引入到了 C# 中,在得到了大量的關注以後 Java 也引入了該特性。使用泛型可讓開發者消除類型轉換,由於編譯器可以運行特定的類型檢查,而對於不支持泛型的語言而言這是沒法作到的。雖然剛開始將泛型引入 C# 的時候確實產生了一些爭論,但如今它已經被 C# 和 Java 社區所廣泛接受。
泛型提供了一種方式可讓咱們推遲類型的定義,一般(但不限於)是參數和返回值的類型。雖然它聽起來很複雜,可是實際上經過一個簡單的示例咱們就能很是容易地理解它。
//At the moment of creating this function
//I am not defining what T is. The actual
//Type of T will be deferred to the call
//of the doNothing function.
func doNothing (item:T) -> T {
return item
}
//When I call doNothing, I am implicitly
//setting the type of T to the Type of the
//parameter I am sending. In this case,
//an Array.
//Notice how the compiler knows, that the
//return type is an Array.
doNothing([1, 2, 3]).count
雖然上面並非一個真實的例子,可是經過它咱們可以看到在編譯時肯定數組內部元素類型的便利。下面是一個更簡單的示例,注意編譯器是如何知道數組是包含字符串類型的:
var list = ["hello", "world"]
list[0].uppercaseString //HELLO
泛型的使用範圍並無被限定於參數,咱們也能夠定義泛型類、枚舉和結構。事實上,在前面的示例中,list 的類型是 Array<String>。
你可能會將 Swift 中的泛型與 Objective-C 中的協議類比,雖然它們的語法很是類似,可是概念是很是不一樣的。Objective-C 並不支持泛型。協議提供了一種方式去聲明一個肯定的實現符合某個消息契約,可是契約必須預先指定。例如,使用協議你並不能強迫數組中的全部條目都是同一類型的(不管是什麼類型),可是使用泛型可以作到。除了概念上的不一樣以外,Swift並不支持協議,就像 Objective-C 不支持泛型同樣。
元組是很是簡單的概念,你能夠定義一個有序的值組。當你須要將多個值做爲一個參數來回傳遞、或者被調用的函數須要返回多個值的時候元組會很是有用。元組並不須要咱們爲它的值定義任何類型,編譯時會完成全部的類型推理和類型檢查工做。定義元組的語法以下:
(1, "Two", ["Three"])
在上面的例子中,咱們建立了一個帶有三個值的元組,第一個是一個整數,第二個是字符串,第三個是一個字符串類型的數組。乍一看這很像一個數組,但概念徹底不一樣。你不能從一個元組中刪除或者向裏追加元素,同時注意編譯器是如何知道每個值的確切類型的:
你能夠經過元素在元組內部的位置引用它的值,正如圖片所提示的那樣;或者你也能夠爲每個值指定一個名稱。若是一個函數須要返回幾個值,那麼這是很是方便的,同時它也能讓咱們避免定義那些特定於某個函數的類或者結構。下面讓咱們看一個這樣的例子:
func info(items:[Int]) -> (avg:Int, min:Int, max:Int) {
var sum = items.reduce(0, { $0 + $1 })
var min = items.reduce(Int.max, { $0 > $1 ? $1 : $0})
var max = items.reduce(Int.min, { $0 < $1 ? $1 : $0})
return (sum / items.count, min, max)
}
var result = info([1, 2, 3, 4, 5, 6])
result.avg //3
result.min //1
result.max //6
元組提供了一種很是簡單的使用多個值的方法,讓咱們省去了定義一個特定的類或者結構的額外工做。
除了上面介紹的特性以外 Swift 還有不少其餘的優秀特性值得咱們一看,例如屬性觀察器、可選連接以及擴展。
我相信Swift具有快速成爲一門流行的 iOS 和 OS X 編程語言所須要的全部必須條件,不管是在企業領域仍是在消費者領域。強類型和類型推理特性將會讓它很是適合於企業開發,而它的簡單性和乾淨的語法則會吸引那些從事消費者項目的開發人員。