1. 定義常量和變量
a. Swift語法
常量:
let MaxNumber = 10
變量:
var name = 1
b. Java語法
常量:
public final int MaxNumber= 10;
變量:
public String name = "morden";
這里要注意的是swift有類型標注(type annotation)這個語法:如果要添加類型標注,需要在常量或者變量名后面加上一個冒號和空格,然后加上類型名稱。但是因為swift編譯器可以進行類型安全判定,所以一般為了代碼簡練,
可以不加類型標注,關於類型標注,后面會有提到。加類型標注的語法如下:
常量:
let MaxNumber :Int = 10
變量:
var name : String = "morden"
常量與變量名不能包含數學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與制表符。也不能以數字開頭,但是可以在常量與變量名的其他地方包含數字。
2. Swift和Java的輸出語法
Swift:
print("hello world")
Java
System.out.println("hello world");
3. 注釋
Swift和Java注釋大體相同,都可以單行注釋和多行注釋。唯一不同點就是Swift支持多行注釋可以嵌套在其它的多行注釋中。
/* 這是第一個多行注釋的開頭 /* 這是第二個被嵌套的多行注釋 */ 這是第一個多行注釋的結尾 */
4. 分號
Java要求每一行代碼都有分號,而Swift不同,不要求每一行必須有分號,但是一種情況除外:當在同一行內寫多條獨立的語句時候,每個語句需要分號隔開
let apple : String = "apple" ; print("hello world");
5. 類型標注
類型標注:在Swift中,每次聲明常量和變量的時候,不是一定要顯式指定類型。如果你沒有顯式指定類型,Swift 會使用類型推斷(type inference)來選擇合適的類型。有了類型推斷,編譯器可以在編譯代碼的時候自動推斷出表達式的類型。Swift 和Java都是一個類型安全(type safe)的語言。如果你申明的變量是String類型的時候,再對其進行賦值時候,傳了int類型,編譯器會報錯。但是在語法上,這兩個語言有所不同。
Java一般申明變量時候,會將類型放在前面,如下代碼:
String name = "morden";
Swift會將類型放在后面,如下代碼:
var name : String = "morden"
而有時候,我們申明變量時候,不加類型,編譯器就會自己推斷變量類型,這就是類型標注
在Swift中,具體類型標注代碼如下:
let number = 42
number會被推測為 Int 類型
let anotherNumber = 3 + 0.14159
原始值 anotherNumber 沒有顯式聲明類型,而表達式中出現了一個浮點字面量,所以表達式會被推斷為Double
類型。
6. 數值型字面量
Swift和Java在數值型字面量方面有很多異同,只有十進制和16進制表示是相同的。
Swift:
- 一個十進制數,沒有前綴
- 一個二進制數,前綴是
0b
- 一個八進制數,前綴是
0o
- 一個十六進制數,前綴是
0x
Java:
- 一個十進制數,沒有前綴
- 一個二進制數,Java沒有二進制的表示方式,一般都16進制表示
- 一個八進制數,前綴是
0
- 一個十六進制數,前綴是
0x
另外,Swift數值類字面量可以包括額外的格式來增強可讀性。整數和浮點數都可以添加額外的零並且包含下划線,並不會影響字面量:
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
7. 整數和浮點數轉換
Swift:Swift中不支持隱式轉換,當兩個變量存儲不同范圍的值時候,所以你必須根據不同情況選擇性使用數值型類型轉換。代碼如下:
let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine
這個例子中,常量three
的值被用來創建一個Double
類型的值,所以加號兩邊的數類型須相同。如果不進行轉換,兩者無法相加。
Java支持隱式轉換,代碼如下:
int three = 3; double pointOneFourOneFiveNine = 0.14159; double pi = three + pointOneFourOneFiveNine;
Swift語法支持類型別名,這點Java不支持,當在編程中,定義了一個類型別名之后,你可以在任何使用原始名的地方使用別名。具體代碼如下:
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
UInt16 取值范圍是0-255 maxAmplitudeFound 現在是 0
8. 布爾值
Swift的布爾(Boolean)類型,關鍵字叫做Bool
。Java是boolean關鍵字。具體用法上有點差別,但是還在接受范圍之內。
Swift:
let flag : Bool = false if flag{ print("Mmm, tasty turnips!") }else{ print("Eww, turnips are horrible.") }
Java:
boolean flag = true; if(flag){ System.out.println("Mmm, tasty turnips!"); }else{ System.out.println("Eww, turnips are horrible."); }
9. key-value
Swift提出了一個非常有意思的語法叫元組。有點類似Java的map數據結構,但是又與map有非常大的不同。這里介紹下元組的用法。
let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String),值是 (404, "Not Found")
let http200Status = (statusCode: 200, description: "OK")
//可以在定義元組的時候給單個元素命名:
可以將一個元組的內容分解(decompose)成單獨的常量和變量,然后你就可以正常使用它們:
print(statusCode) print("The status code is \(http404Error.0)") print("The status code is \(http404Error.statusCode)") print(statusMessage) print("The status code is \(http404Error.1)") print("The status code is \(http404Error.description)")
10. 可選類型(optionals)
我們先看下面一段代碼:
let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber 被推測為類型 "Int?", 或者類型 "optional Int"
因為toInt
方法可能會失敗,所以它返回一個可選類型(optional)Int
,而不是一個Int
。一個可選的Int
被寫作Int?
而不是Int
。問號暗示包含的值是可選類型,也就是說可能包含Int
值也可能不包含值。(不能包含其他任何值比如Bool
值或者String
值。只能是Int
或者什么都沒有。)
當你確定可選類型確實包含值之后,你可以在可選的名字后面加一個感嘆號(!
)來獲取值。這個驚嘆號表示“我知道這個可選有值,請使用它。”這被稱為可選值的強制解析(forced unwrapping):
let possibleNumber = "123" let convertedNumber=Int(possibleNumber); let stee = convertedNumber! //stee 是Int,不是Int?
可選綁定(optional binding):來判斷可選類型是否包含值,如果包含就把值賦給一個臨時常量或者變量。看下面代碼:
let possibleNumber = "123" if let actualNumber = Int(possibleNumber) { print("\(actualNumber) has an integer value of \(actualNumber)") } else { print("\(possibleNumber) could not be converted to an integer") } // 輸出 "123 has an integer value of 123"
“如果possibleNumber.toInt
返回的可選Int
包含一個值,創建一個叫做actualNumber
的新常量並將可選包含的值賦給它。”
如果轉換成功,actualNumber
常量可以在if
語句的第一個分支中使用。它已經被可選類型包含的值初始化過,所以不需要再使用!
后綴來獲取它的值。在這個例子中,actualNumber
只被用來輸出轉換結果。
11. nil
在 Swift 中,nil
不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為nil
,不只是對象類型。一些簡單的用法如下:
var serverResponseCode: Int? = 404 // serverResponseCode 包含一個可選的 Int 值 404 serverResponseCode = nil // serverResponseCode 現在不包含值 var surveyAnswer: String? // surveyAnswer 被自動設置為 nil
12. 隱式解析可選類型
隱式解析可選類型(implicitly unwrapped optionals)。把想要用作可選的類型的后面的問號(String?
)改成感嘆號(String!
)來聲明一個隱式解析可選類型,隱式解析可選類型主要被用在 Swift 中類的構造過程中。
一個隱式解析可選類型其實就是一個普通的可選類型,但是可以被當做非可選類型來使用,並不需要每次都使用解析來獲取可選值。下面的例子展示了可選類型String
和隱式解析可選類型String
之間的區別:
let possibleString: String? = "An optional string." println(possibleString!) // 需要驚嘆號來獲取值 // 輸出 "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // 不需要感嘆號 // 輸出 "An implicitly unwrapped optional string."
注意:
如果你在隱式解析可選類型沒有值的時候嘗試取值,會觸發運行時錯誤。和你在沒有值的普通可選類型后面加一個驚嘆號一樣。
13. 斷言
斷言會在運行時判斷一個邏輯條件是否為true
。從字面意思來說,斷言“斷言”一個條件是否為真。你可以使用斷言來保證在運行其他代碼之前,某些重要的條件已經被滿足。如果條件判斷為true
,代碼運行會繼續進行;如果條件判斷為false
,代碼運行停止,你的應用被終止。
如果你的代碼在調試環境下觸發了一個斷言,比如你在 Xcode 中構建並運行一個應用,你可以清楚地看到不合法的狀態發生在哪里並檢查斷言被觸發時你的應用的狀態。此外,斷言允許你附加一條調試信息。
你可以使用全局assert
函數來寫一個斷言。向assert
函數傳入一個結果為true
或者false
的表達式以及一條信息,當表達式為false
的時候這條信息會被顯示:
let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // 因為 age < 0,所以斷言會觸發
當條件可能為假時使用斷言,但是最終一定要保證條件為真,這樣你的代碼才能繼續運行。斷言的適用情景:
- 整數類型的下標索引被傳入一個自定義下標腳本實現,但是下標索引值可能太小或者太大。
- 需要給函數傳入一個值,但是非法的值可能導致函數不能正常執行。
- 一個可選值現在是
nil
,但是后面的代碼運行需要一個非nil
值。
參考鏈接:
http://special.csdncms.csdn.net/the-swift-programming-language-in-chinese/Introduction/template/chapter2/01_The_Basics.html