Swift程式語言初探
繼WWDC2014後,新的程式語言Swift浮出水面,它具有快速、現代、安全、可互動等特徵,並且其語法簡單,入門門檻低,有望替代語法複雜難懂的Objective-C語言。據其作者Chris Lattner在部落格上聲稱,該語言開發只用了4年時間,並且底層框架基本上都是由其一人開發完成。
按照慣例,先用Swift來編寫一個簡單的"Hello World"
println("Hello World")
沒錯,就這麼簡單,沒有IMPORT語句,沒有main函式,也沒有@符號,分號也不是必須的。編譯執行可以看到控制檯列印的Hello World字樣。
這裡的println是全域性函式,負責列印引數內容,並換行。
Swift可以說是融合其他優秀程式語言的結果,因此許多語法都和其他語言存在共同之處。下面將簡單介紹一下該語言的一部分內容:
1. Swift用var宣告變數,用let宣告常量,如
var legs = 4 // 變數legs
let PI = 3.1415926 // 常量PI
那麼legs和PI到底是什麼型別呢?答案是Type Inference(型別推測),由於這兩個語句在宣告的同時並且初始化,因為4是Int型別,因此推測變數legs為Int型別,同理,3.1415926為Double型別,因此推測PI為Double型別。也可以強制規定型別:
若legs變數是整數型別,只需在變數名後新增冒號,緊接著跟隨一個型別名即可。var legs:Int let PI:Double
2. 賦值運算子沒有返回值,而在其他一些語言中,賦值運算子返回的是變數的值,(如 a = 5 表示式返回5),而作為新手在做條件判斷時,經常用賦值運算子來代替"==",導致一些很難發現的邏輯錯誤,而在Swift中不會出現這種情況,因為這是一個語法錯誤,在編譯期間會給出錯誤資訊,如 if a = 5 { ... } ,if接受的是一個Bool值,而a = 5沒有返回值,因此會出錯。
/* In C++ */ int a = 1; if(a = 5) { ... } // Compile Success /* In Swift */ var a = 1 if a = 5 { ... } // Compile error // if a == 5 {...} This is correct one
3. switch語句的case後不用加break。這也是其他語言新手經常犯的一個錯誤,而在Swift中,switch選擇的case語句執行完畢後立即跳出switch語句,而不會因為語句後沒有break繼續執行後面的case或者default語句。
var a = 1
switch a {
case 1: println(1)
case 2: println(2)
default: println(3)
}
// no break at all
4. 可以用n..m 或者 n...m 代替一個數組,比如:
for index in 0 ..< 3 { println(index) }
// 0
// 1
// 2
..代表前閉後開,...代表前後都閉合,所以0..3代表陣列[0,1,2],而0...3代表[0,1,2,3]
5. 如何在字串中插入變數或常量呢?Swift提供一個特殊的語法:
var number = 5
println("I got \(number) books")
// I got 5 books
是不是很簡單,只需在字串中用\(和)包裹你要插入的變數或常量即可。
6. 在Swift中,存在兩種型別,一種是引用型別(reference type),一種是值型別(value type),class是引用型別,而enumeration和struct是值型別,它們的一個重要區別是傳遞的方式不一樣,一個是傳遞副本,一個是傳遞本身。
在Swift中,class的樣子是:
class Vehicle {
var wheels:Int?
var maxPassengers:Int?
func description() -> String {
return "This vehicle has \(wheels!) wheels,max passengers is \(maxPassengers!) " }
init(withWheels wheels:Int,andMaxPassengers maxPassengers:Int) {
self.wheels = wheels
self.maxPassengers = maxPassengers }
deinit { }
}
該類名為Vehicle,聲明瞭兩個屬性,wheels和maxPassengers。以及一個例項方法description,該方法沒有引數,返回值為字串型別。同時,該類提供一個初始化方法,init是關鍵字,該方法接受兩個引數,代表之前宣告的兩個屬性。該引數包括三個部分,分別是外部引數名(external parameter name),區域性引數名(local parameter name)以及引數型別,在方法呼叫裡會用到外部引數名,區域性引數名是用在方法體內的。引進這種方法的好處是繼承Objective-C的優良特性,使程式碼段更像一個句子,更富有描述性。下面來看看如何使用這個類:
var porsche = Vehicle(withWheels:4,andMaxPassengers:5)
println(porsche.description())
// This vehicle has 4 wheels,max passengers is 5
另外在類的屬性中,?代表optional,即該屬性要麼有值,要麼沒有值(nil)。